2011-09-16 43 views
8

我使用LINQ廣泛在我的項目,到目前爲止表現不錯,我有,如果我已經使用LINQ的是這樣的LINQ的計數方法和性能

var getData = objData.where(obj => obj.isDelete ==false) 
if (getData != null && getData.Count() > 0) 
    foreach(xyz as obj in getdata.ToList()) 
    { 
     //some operation 
    } 

不getData.Count(只有一個疑問)和getdata.ToList()在對象上執行兩個不同的提取?或者,當執行getData.Count()時,根據deffer加載概念,則不會爲.ToList執行任何操作。

如果不是那麼我應該刪除計數條件,它會提高性能?

我正在使用Enterprise Library 5.0 acessor方法從數據庫中獲取數據 List lstpack = new List();

  var accessor = _sqlDatabase.CreateSprocAccessor<PackageForClient>("PackageForClientApp", MapBuilder<PackageForClient> 
         .MapAllProperties() 
         .Build() 
       ); 

      var Data = accessor.Execute(startdate, enddate,beinh); 
      if (Data != null) //&& Data.Count() > 0 //This has been removed as it is doing an extra fetch 
       lstpack = Data.ToList<PackageForClient>(); 

現在回到列表

回答

13

很難肯定地說,因爲我們不知道什麼是getData,但:

  • 是的,有可能他們將完全獨立運作
  • 一般情況下,使用Any()代替Count() > 0;它可以有很多更有效,特別是在LINQ到對象
  • 調用ToList將是相對便宜的,當它是空的 - 只是做如果你如果不這樣做真的需要需要一個列表
  • 它在列表中,只是重複的(如果沒有數據,你將永遠不會進入循環體)
  • Where不會返回NULL

換句話說,我可能會寫:

foreach (Obj xyz in objData.Where(obj => !obj.isDelete)) 
{ 
    //some operation 
} 
+0

太棒了!謝謝,這裏getData是Enterprise Library 5.0的結果集返回的對象列表,驚訝地發現它執行兩次存儲過程,一次我們調用getData的Count方法,另一個當ToList被使用時執行。 – Deepesh

+0

在我的問題中只添加了一個代碼 – Deepesh

+0

@Deepesh:你爲什麼驚訝地看到這個? 'getData'不是對象列表 - 它是*查詢*。調用'ToList'就是把它變成一個對象列表。 –