[英]Multiple func parameters for LINQ - EF
我在擺弄linq的Func
參數(在實體框架上)。 然后我發現了這種行為
var idMatchQuery = new Func<MyClass, bool>(x => x.Id == someId);
var statusMatchQuery = new Func<MyClass, bool>(x => x.Status == someStatus);
/// works
var a = myClassEntity.FirstOrDefault(idMatchQuery);
/// doesn't work
var b = myClassEntity.FirstOrDefault(p => idMatchQuery(p) && statusMatchQuery(p));
/// doesn't work
var c = myClassEntity.FirstOrDefault(p => idMatchQuery(p) && p.Status == 1);
由於EF
無法識別這些查詢,因此它將引發UnsupportedOperationException
。 如果以上方法均無效,我本來可以接受的容易得多。 但是,當它僅與一個Func
查詢一起使用時,卻與其他查詢結合使用時,卻使我感到Func
。
我敢肯定有一個解釋,但是我想我的搜索關鍵詞對於我尋找的答案太幼稚了。
這種行為的解釋是什么?
導致EF將您的謂詞轉換為TSQL語言。 您可以檢查一下, FirstOrDefault
方法的參數不是Func<T, bool>
,而是Expression<Func<T, bool>>
,因為最后一個給了我們解析它並將其轉換為TSQL的機會。 當您使用帶有簡單條件EF的兩個Func<T, bool>
或Func<T, bool>
,由於Expression<Func<T, bool>>
內部內容和功能復雜,EF無法將其轉換和解析為TSQL,這就是為什么EF將此謂詞保持在原始狀態,並按照最初編寫的那樣發送到服務器,結果是UnsupportedOperationException
。 因此,對於EF-與其他兩個謂詞相比,解析第一個謂詞要容易得多。
結論 :這是由於將C#謂詞從Expression<Func<T,bool>>
為TSQL的功能和方法所致,因為有時它具有足夠高的復雜性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.