我試圖創建實體框架列表的篩選方法,並更好地瞭解Expression<Func<...
實體框架過濾器「表達式<Func鍵<T, bool>>」
我有一個這樣的測試功能。
public IQueryable<T> Filter<T>(IEnumerable<T> src, Expression<Func<T, bool>> pred)
{
return src.AsQueryable().Where(pred);
}
,如果我這樣做:
context.Table.Filter(e => e.ID < 500);
或本:
context.Table.Filter(e => e.SubTable.Where(et => et.ID < 500).Count() > 0 && e.ID < 500);
這一切運作良好。
但是,如果我這樣做:
context.Table.Filter(e => e.SubTable.Filter(et => et.ID < 500).Count() > 0 && e.ID < 500);
或本:
context.Table.Where(e => e.SubTable.Filter(et => et.ID < 500).Count() > 0 && e.ID < 500);
我收到一個錯誤。 LINQ to Entities does not recognize the method ...Filter...
爲什麼它在一種情況下,而不是在加法器?我應該在過濾器中更改哪些內容才能與相關表一起使用。 我更願意遠離其他外部圖書館,因爲我想知道它是如何工作的,並且能夠在將來的任何場景中使用它。
在前兩種情況下,篩選器正確運行在數據庫中。
通過大量的閱讀和試驗和錯誤我懷疑這是唯一的方法。它會像context.Table.Where(e => e.subTable.Any(MyFilter())); –
@ Pedro.The.Kid:不,它不會。這個方法的結果需要傳遞給最外層的Where,因爲你傳遞給最外層Where的每個表達式並沒有被實際執行,而是被解釋了。 –
我做了一個測試,這工作var filter = MyFilter(); context.Table.Where(e => e.subTable.AsQueryable()。Any(filter)); –