首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DbFunctions,是在给定上下文中无效的类型。

DbFunctions,是在给定上下文中无效的类型。
EN

Stack Overflow用户
提问于 2022-02-06 00:20:06
回答 3查看 292关注 0票数 0

我试过使用SqlServerDbFunctionsExtensions.DateDiffDay,但是DbFunctions _

CS0119: DbFunctions是在给定上下文中无效的类型

代码语言:javascript
运行
复制
SqlServerDbFunctionsExtensions.DateDiffDay(this Microsoft.EntityFrameworkCore.DbFunctions _, DateTime.Now, i.Invoicedate) + i.ProductNav.GracePeriod.GetValueOrDefault()

我也尝试了以下方法,但是我得到了相同的错误

代码语言:javascript
运行
复制
SqlServerDbFunctionsExtensions.DateDiffDay(DbFunctions _, DateTime.Now, i.Invoicedate) + i.ProductNav.GracePeriod.GetValueOrDefault()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-06 00:36:33

DateDiffDay可拓法。使用对象实例调用它,然后将不带该对象的参数作为第一个参数传递。就你而言:

代码语言:javascript
运行
复制
EF.Functions.DateDiffDay(DateTime.Now, i.InvoiceDate) + i.ProductNav.GracePeriod.GetValueOrDefault();

您可能需要添加using指令:

代码语言:javascript
运行
复制
using Microsoft.EntityFrameworkCore;

以及所需的nuget包装

票数 0
EN

Stack Overflow用户

发布于 2022-02-06 00:33:41

看看这些文档

提供CLR方法,当在LINQ实体查询中使用时,这些方法被转换为数据库函数。在其他上下文中调用这些方法(例如LINQ )将引发NotSupportedException。

您只能在linq中访问实体查询,不能执行您想要做的事情。

这是一个扩展方法,你不能传递它。

代码语言:javascript
运行
复制
public static int DateDiffDay (this Microsoft.EntityFrameworkCore.DbFunctions _, DateTime startDate, DateTime endDate);

论DateDiffDay

您在查询中使用它的方式是DateDiffDay(starDate,EndDate)

代码语言:javascript
运行
复制
var allDaysDifferences = myEntities.Sum(r => EF.Functions.DateDiffDay(r.FromDate, r.ToDate));
票数 2
EN

Stack Overflow用户

发布于 2022-02-06 07:01:02

其他答案是你通常会做的,但我认为值得指出的是,在它们暗示扩展方法的地方是某种神奇的东西,只能以某种方式调用,这并不是真的。

没有什么可以阻止您调用扩展方法,就好像它是任何正常的静态方法一样;您只需要提供一些实例来调用它作为第一个参数。

下面是一个扩展方法:

代码语言:javascript
运行
复制
public static string NoL(this string x){
  return x.Replace("l","");
}

注意第一个参数上的this,使它成为一个扩展。您可以将其称为“在字符串上”,也可以将其传递为字符串:

代码语言:javascript
运行
复制
var hw = "Hello World";

var heoword1 = hw.NoL());
var heoword2 = Ext.NoL(hw);

在所有情况下,您可能都会执行第一种形式,因为存在静态方法扩展,以使代码更加紧凑和可读性更好,但从技术上讲,调用方法没有任何问题,只是没有提供有效的第一个参数。这样做是可行的:

代码语言:javascript
运行
复制
SqlServerDbFunctionsExtensions.DateDiffDay(EF.Functions, DateTime.Now, i.Invoicedate) 

EF.Functions是通常只需调用DateDiff的实例:

代码语言:javascript
运行
复制
EF.Functions.DateDiff(DateTime.Now, i.Invoicedate) 

--

那么,您什么时候会使用像普通方法那样的扩展方法呢?可能不是很多地方,但如果它的签名与接受委托的某个方法完全匹配,则可能是有意义的。

例如,假设我们有一个扩展方法:

代码语言:javascript
运行
复制
public static class Exts{
  public static string CombineStringAndInt(this string s, int i){
    return s+i;
  }
}

它需要一个字符串和一个int。LINQ的Select有一个重载,它接受带有string,int参数的委托。您可以这样调用上面的方法:

代码语言:javascript
运行
复制
var arr = new[]{"a","b"};

arr.Select((s, i) => s.CombineStringAndInt(i));

但没有什么能阻止你这样称呼它:

代码语言:javascript
运行
复制
arr.Select(Exts.CombineStringAndInt);

因为它是一个接受字符串和int的方法,这是Select重载所要求的,它接受列表项的委托及其所在的索引。

扩展方法并没有什么神奇或奇怪的地方,它阻止了像这样的扩展,或者限制它只用于instance.ExtensionMethod(arg2,arg3..)样式

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71003245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档