簡體   English   中英

LINQ to Entities不支持擴展方法?

[英]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)'方法,並且此方法無法轉換為商店表達式。

現在我有兩個問題:

  1. 我搜索了這個錯誤,發現許多問題與我在stackoverflow中的問題相同。 所有答案都是“Linq to Entities無法將此擴展方法轉換為SQL查詢”。 如果有人幫助我知道,為什么我的第一個查詢沒有引起任何錯誤,我將不勝感激?

  2. 如何更改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM