DbFunctions 是一种在给定上下文中无效的类型
DbFunctions, is a type which is not valid in the given context
我尝试使用 SqlServerDbFunctionsExtensions.DateDiffDay
但 DbFunctions _
说
CS0119: DbFunctions is a type which is not valid in the given context
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()
Provides CLR methods that get translated to database functions when
used in LINQ to Entities queries. Calling these methods in other
contexts (e.g. LINQ to Objects) will throw a 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));
DateDiffDay is an extension method。您使用对象实例调用它,然后将没有该对象的参数作为第一个参数传递。你的情况:
EF.Functions.DateDiffDay(DateTime.Now, i.InvoiceDate) + i.ProductNav.GracePeriod.GetValueOrDefault();
您可能需要添加 using 指令:
using Microsoft.EntityFrameworkCore;
和所需的 nuget 包
其他答案是您 通常会做的,但我认为值得指出的是,它们暗示扩展方法是某种神奇的东西,只能在从某种意义上说,这不是真的
没有什么能阻止您像调用任何普通静态方法一样调用扩展方法;你只需要提供一些实例来调用它作为第一个参数
这里有一个扩展方法:
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);
在可能的所有情况下,您都会使用第一种形式,因为存在静态方法扩展以使代码更紧凑和可读,但从技术上讲,您尝试调用您所做的方法并没有错,只是您没有' t 提供有效的第一个参数。这会起作用:
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;
}
}
它接受一个字符串和一个整数。 LINQ 的 Select
有一个重载,它接受一个参数为 string,int
的委托。你可以像这样调用上面的方法:
var arr = new[]{"a","b"};
arr.Select((s, i) => s.CombineStringAndInt(i));
但没有什么能阻止你这样称呼它:
arr.Select(Exts.CombineStringAndInt);
因为它是一个接受字符串和整数的方法,这是接受列表项委托的Select
重载所要求的,而索引在
扩展方法没有任何神奇或奇怪的地方可以阻止它像这样被调用,或者限制它只用于 instance.ExtensionMethod(arg2,arg3..)
风格
我尝试使用 SqlServerDbFunctionsExtensions.DateDiffDay
但 DbFunctions _
说
CS0119: DbFunctions is a type which is not valid in the given context
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()
Provides CLR methods that get translated to database functions when used in LINQ to Entities queries. Calling these methods in other contexts (e.g. LINQ to Objects) will throw a 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));
DateDiffDay is an extension method。您使用对象实例调用它,然后将没有该对象的参数作为第一个参数传递。你的情况:
EF.Functions.DateDiffDay(DateTime.Now, i.InvoiceDate) + i.ProductNav.GracePeriod.GetValueOrDefault();
您可能需要添加 using 指令:
using Microsoft.EntityFrameworkCore;
和所需的 nuget 包
其他答案是您 通常会做的,但我认为值得指出的是,它们暗示扩展方法是某种神奇的东西,只能在从某种意义上说,这不是真的
没有什么能阻止您像调用任何普通静态方法一样调用扩展方法;你只需要提供一些实例来调用它作为第一个参数
这里有一个扩展方法:
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);
在可能的所有情况下,您都会使用第一种形式,因为存在静态方法扩展以使代码更紧凑和可读,但从技术上讲,您尝试调用您所做的方法并没有错,只是您没有' t 提供有效的第一个参数。这会起作用:
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;
}
}
它接受一个字符串和一个整数。 LINQ 的 Select
有一个重载,它接受一个参数为 string,int
的委托。你可以像这样调用上面的方法:
var arr = new[]{"a","b"};
arr.Select((s, i) => s.CombineStringAndInt(i));
但没有什么能阻止你这样称呼它:
arr.Select(Exts.CombineStringAndInt);
因为它是一个接受字符串和整数的方法,这是接受列表项委托的Select
重载所要求的,而索引在
扩展方法没有任何神奇或奇怪的地方可以阻止它像这样被调用,或者限制它只用于 instance.ExtensionMethod(arg2,arg3..)
风格