我试过使用SqlServerDbFunctionsExtensions.DateDiffDay
,但是DbFunctions _
说
CS0119: DbFunctions是在给定上下文中无效的类型
SqlServerDbFunctionsExtensions.DateDiffDay(this Microsoft.EntityFrameworkCore.DbFunctions _, DateTime.Now, i.Invoicedate) + i.ProductNav.GracePeriod.GetValueOrDefault()
我也尝试了以下方法,但是我得到了相同的错误
SqlServerDbFunctionsExtensions.DateDiffDay(DbFunctions _, DateTime.Now, i.Invoicedate) + i.ProductNav.GracePeriod.GetValueOrDefault()
发布于 2022-02-06 00:36:33
DateDiffDay是可拓法。使用对象实例调用它,然后将不带该对象的参数作为第一个参数传递。就你而言:
EF.Functions.DateDiffDay(DateTime.Now, i.InvoiceDate) + i.ProductNav.GracePeriod.GetValueOrDefault();
您可能需要添加using指令:
using Microsoft.EntityFrameworkCore;
以及所需的nuget包装
发布于 2022-02-06 00:33:41
提供CLR方法,当在LINQ实体查询中使用时,这些方法被转换为数据库函数。在其他上下文中调用这些方法(例如LINQ )将引发NotSupportedException。
您只能在linq中访问实体查询,不能执行您想要做的事情。
这是一个扩展方法,你不能传递它。
public static int DateDiffDay (this Microsoft.EntityFrameworkCore.DbFunctions _, DateTime startDate, DateTime endDate);
论DateDiffDay
您在查询中使用它的方式是DateDiffDay(starDate,EndDate)
var allDaysDifferences = myEntities.Sum(r => EF.Functions.DateDiffDay(r.FromDate, r.ToDate));
发布于 2022-02-06 07:01:02
其他答案是你通常会做的,但我认为值得指出的是,在它们暗示扩展方法的地方是某种神奇的东西,只能以某种方式调用,这并不是真的。
没有什么可以阻止您调用扩展方法,就好像它是任何正常的静态方法一样;您只需要提供一些实例来调用它作为第一个参数。
下面是一个扩展方法:
public static string NoL(this string x){
return x.Replace("l","");
}
注意第一个参数上的this
,使它成为一个扩展。您可以将其称为“在字符串上”,也可以将其传递为字符串:
var hw = "Hello World";
var heoword1 = hw.NoL());
var heoword2 = Ext.NoL(hw);
在所有情况下,您可能都会执行第一种形式,因为存在静态方法扩展,以使代码更加紧凑和可读性更好,但从技术上讲,调用方法没有任何问题,只是没有提供有效的第一个参数。这样做是可行的:
SqlServerDbFunctionsExtensions.DateDiffDay(EF.Functions, DateTime.Now, i.Invoicedate)
EF.Functions是通常只需调用DateDiff的实例:
EF.Functions.DateDiff(DateTime.Now, i.Invoicedate)
--
那么,您什么时候会使用像普通方法那样的扩展方法呢?可能不是很多地方,但如果它的签名与接受委托的某个方法完全匹配,则可能是有意义的。
例如,假设我们有一个扩展方法:
public static class Exts{
public static string CombineStringAndInt(this string s, int i){
return s+i;
}
}
它需要一个字符串和一个int。LINQ的Select
有一个重载,它接受带有string,int
参数的委托。您可以这样调用上面的方法:
var arr = new[]{"a","b"};
arr.Select((s, i) => s.CombineStringAndInt(i));
但没有什么能阻止你这样称呼它:
arr.Select(Exts.CombineStringAndInt);
因为它是一个接受字符串和int的方法,这是Select
重载所要求的,它接受列表项的委托及其所在的索引。
扩展方法并没有什么神奇或奇怪的地方,它阻止了像这样的扩展,或者限制它只用于instance.ExtensionMethod(arg2,arg3..)
样式
https://stackoverflow.com/questions/71003245
复制相似问题