Entity Framework - Func引發的數據庫全表查詢

Entity Framework - Func引發的數據庫全表查詢

使用 Entity Framework 最要當心的性能殺手就是 —— 不正確的查詢代碼形成的數據庫全表查詢。html

咱們就遇到了一次,請看下面的示例代碼:數據庫

複製代碼

Func<QuestionFeed, > predicate = ;
 (type == )
{
    predicate = f => f.FeedID == id && f.IsActive == ;
}

{
    predicate = f => f.FeedID == id;
}
_questionFeedRepository.Entities.Where(predicate);

複製代碼

上面代碼邏輯是根據條件動態生成LINQ查詢條件,將Func類型的變量做爲參數傳給Where方法。ide

實際上Where要求的參數類型是:Expression<Func<TSource, bool>>。post

寫代碼時沒注意這個問題,運行結果也正確。發佈後,在SQL Server Profiler監測中,發現QuestionFeed對應的數據庫表出現了全表查詢,才知道這個地方的問題。性能

問題就是:url

將Func類型的變量做爲參數傳給Where方法進行LINQ查詢時,Enitity Framework會產生全表查詢,將整個數據庫表中的數據加載到內存,而後在內存中根據Where中的條件進一步查詢。spa

解決方法:code

不要用Func<TSource, bool>,用Expression<Func<TSource, bool>>。orm

複製代碼

Expression<Func<QuestionFeed, >> predicate=;
 (type == )
{
    predicate = f => f.FeedID == id && f.IsActive == ;
}

{
    predicate = f => f.FeedID == id;
}
_questionFeedRepository.Entities.Where(predicate);
相關文章
相關標籤/搜索