DbFunctions 是一种在给定上下文中无效的类型

DbFunctions, is a type which is not valid in the given context

我尝试使用 SqlServerDbFunctionsExtensions.DateDiffDayDbFunctions _

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()

Take a look at these docs

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..) 风格