我想寫一個LINQ實體擴展方法,它需要一個Func來選擇一個屬性ID並將其與ID列表進行比較。如何在Linq to Entity Framework的表達式中使用Func?
類
public class A
{
public int AId { get; set; }
}
public class B
{
public int BId { get; set; }
}
擴展方法
public static IQueryable<T> WithId<T>(this IQueryable<T> entities,
Func<T, int> selector, IList<int> ids)
{
Expression<Func<T, bool>> expression = x => ids.Contains(selector(x));
return entities.Where(expression); // error here (when evaluated)
}
調用方法
var ids = new List<int> { 1, 2, 3 };
DbContext.EntityAs.WithId(e => e.AId, ids);
DbContext.EntityBs.WithId(e => e.BId, ids);
我的問題體驗是它試圖調用實體框架中不允許的功能。
如何使用屬性選擇器(Func)來評估查詢?
您可以在EF查詢中調用的代碼範圍受限於它仍然需要在SQL中進行翻譯的事實。在你的情況下,EF不知道如何自動翻譯IList。 –
我不確定你是否正確。 DbContext.EntityAs.Where(e => ids.Contains(e.Id))由EF正確轉換。我只是想做一個可重用的函數,以便我可以定義要選擇的屬性。 – David
因爲在另一個實體關係的情況下,EF知道如何在可枚舉的情況下選擇x,其中x在(1,2,3)中,或者選擇x,其中x在(選擇y)中。在你的情況下,EF需要編譯類似'select x where x in(select y(where F(y)in(F(1),F(2),...))''。儘管可以手動執行此操作,但EF不支持該情況*尚未* –