簡體   English   中英

LINQ-EF的多個函數參數

[英]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.

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