[英]LINQ to Entities does not support extension method?
我有兩個像這樣的擴展方法
public static IQueryable<T> CurrentVersion(this IQueryable<T> queryable, DateTime date)
{
return queryable.Where(p => p.CreationDate>date);
}
public static IEnumerable<T> CurrentVersion(this IEnumerable<T> queryable, DateTime date)
{
return queryable.Where(p => p.CreationDate>date);
}
我的模特是
public class Group {
..
ICollection<GroupMembers> GroupMembers { get; set; }
}
當我在此查詢中使用擴展方法時,一切正常
var q = Db.Groups.CurrentVersion();
var result = q.ToList();
但是當我在流動查詢中使用它時,我得到一個錯誤
var q = Db.Groups.SelectMany(p => p.GroupMembers.AsQueryable().CurrentVersion(date));
OR
var q = Db.Groups.SelectMany(p => p.GroupMembers.AsEnumerable().CurrentVersion(date));
var result = q.ToList(); // Here I get error
錯誤:
LINQ to Entities無法識別方法'System.Linq.IQueryable
1[..](System.Linq.IQueryable
1 [...,System.DateTime)'方法,並且此方法無法轉換為商店表達式。
現在我有兩個問題:
我搜索了這個錯誤,發現許多問題與我在stackoverflow中的問題相同。 所有答案都是“Linq to Entities無法將此擴展方法轉換為SQL查詢”。 如果有人幫助我知道,為什么我的第一個查詢沒有引起任何錯誤,我將不勝感激?
如何更改Linq-to-Entities可以識別的擴展方法?
Linq查詢需要轉換為sql。 當您將CurrentVersion擴展名稱為內聯時,如下所示:
Db.Groups.CurrentVersion();
然后EF只調用CurrentVersion方法,得到生成的IQueryable對象並轉換為查詢。 另一方面,在該查詢的情況下:
var q = Db.Groups.SelectMany(p => p.GroupMembers.AsQueryable().CurrentVersion(date));
可能不會在代碼中調用SelectMany中的內部表達式! 它意味着被翻譯成sql。 所以它被視為Expression對象然后被解析,但在你的情況下,它包含Invoke Expression,因為你正在調用方法但是這不能從明顯的原因轉換為sql。 因此,從SelectMany lambda參數中你不能調用任何方法,你必須提供適當的表達式。 CurrentVersion方法提供的最有價值的東西是過濾表達式。 像這樣改變你的方法:
public static Expression<T, bool> CurrentVersion( DateTime date)
{
return p => p.CreationDate > date;
}
像這樣使用它:
var q = Db.Groups.Where(ExpressionsHelper.CurrentVersion(date));
...
Expression<T, bool> filterExpression = ExpressionsHelper.CurrentVersion(date);
Db.Groups.SelectMany(p => p.GroupMembers.AsQueryable().Where(filterExpression));
如果您願意,您可以使用新方法擴展方法共享過濾邏輯:
public static IQueryable<T> CurrentVersion(this IQueryable<T> queryable, DateTime date)
{
return queryable.Where(ExpressionsHelper.CurrentVersion(date));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.