2013-02-08 51 views
1

我使用的對象集的方法來做各種查詢的表,即從中選擇幾個記錄這樣:對象集的Where()方法和內存

var results = Repository.Find(c => c.Enabled == 1).ToList(); 

這裏的查找方法我庫:

public IEnumerable<T> Find(Func<T, bool> predicate) 
    { 
     try 
     { 
      return _objectSet.Where<T>(predicate); 
     } 
     catch 
     { 
      throw; 
     } 
    } 

現在,如果在目標表大約1,000,000條記錄,我可以看到進程的內存使用量增長了不少,即使查找呼叫我在做應該返回幾個記錄最。

似乎所有的記錄被拉到客戶端,然後過濾。這顯然不是我想讓LINQ做的事情。

你看到什麼明顯的錯誤與我在做什麼?

在此先感謝。

+1

不使用IEnumerable 它將每個數據行一次拉到內存中,而不是您應該使用IQueryable MUG4N 2013-02-08 15:09:23

+1

您的Find方法完全沒有任何生產效率。你爲什麼不直接在'Repository'上直接使用'Where'? – Servy 2013-02-08 15:11:42

+0

@ MUG4N他只使用它的輸出,應該已經過濾了,所以這不是問題。 – Servy 2013-02-08 15:12:56

回答

2

我認爲你應該使用Expression<Func<T, bool>>,而不是一個普通Func<T, bool>

public IEnumerable<T> Find(Expression<Func<T, bool>> predicate) { 
    // your code 
} 

Where超載(見ObjectSet Class),以及Func<T> - 過載被IEnumerable<T>定義,而Expression<TDelegate>所使用的IQueryable<T>。因爲predicateFunc<T>編譯器調用用於IEnumerable<T>中定義的擴展方法,其進而獲取所有記錄,並確實LINQ到對象。

+0

從哪個命名空間是Expression? System.Linq.Expressions? – 2013-02-08 15:40:10

+0

然後,我必須做一些錯誤的,因爲我得到這個:非通用型「System.Linq.Expressions.Expression」不能與類型參數一起使用 使用泛型類型「System.Linq.Expressions.Expression 」需要1類型參數 – 2013-02-08 15:45:25

+0

我明白了。對不起,我錯了。基本上它是一個'表達>'而不是一個'表達'。我編輯了我的答案,我會仔細檢查。 – 2013-02-08 15:53:56