我嘗試使用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()
uj5u.com熱心網友回復:
看看這些檔案
提供在 LINQ to Entities 查詢中使用時轉換為資料庫函式的 CLR 方法。在其他背景關系(例如 LINQ to Objects)中呼叫這些方法將引發 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));
uj5u.com熱心網友回復:
DateDiffDay是一種擴展方法。您使用物件實體呼叫它,然后將沒有該物件的引數作為第一個引數傳遞。在你的情況下:
EF.Functions.DateDiffDay(DateTime.Now, i.InvoiceDate) i.ProductNav.GracePeriod.GetValueOrDefault();
您可能需要添加 using 指令:
using Microsoft.EntityFrameworkCore;
以及所需的 nuget 包
uj5u.com熱心網友回復:
其他答案是您通常會做的,但我認為值得指出的是,它們暗示擴展方法是某種神奇的東西,只能以某種方式呼叫,這不是真的
沒有什么能阻止您呼叫擴展方法,就好像它是任何普通的靜態方法一樣;您只需提供一些實體即可將其作為第一個引數呼叫
這是一個擴展方法:
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);
可能在所有情況下,您都會使用第一種形式,因為存在靜態方法擴展以使代碼更加緊湊和可讀,但是從技術上講,您嘗試呼叫您所做的方法沒有任何問題,您只是沒有提供有效的 first范圍。這會起作用:
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;
}
}
它需要一個字串和一個整數。LINQSelect有一個多載,它接受一個引數為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://www.uj5u.com/qianduan/428913.html
上一篇:使用一個搜索字串搜索多個列值
