Linq Count方法和性能

时间:2011-09-16 13:19:40

标签: 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()是否对对象执行两次不同的提取?或者根据deffer加载概念执行getData.Count()时,不会对.ToList执行任何操作。

如果没有,那么我应该删除计数条件,它会改善性能吗?

我正在使用Enterprise Library 5.0 acessor方法从DB获取数据 列出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>();

现在返回列表

1 个答案:

答案 0 :(得分:13)

我们很难确定,因为我们不知道getData是什么,但是:

  • 是的,可能它们将是完全独立的操作
  • 一般情况下,请使用Any()代替Count() > 0;它可以更高效,特别是在LINQ to Objects
  • 调用ToList在空的时候相对便宜 - 只需如果你需要一个列表
  • 如果你没有真的需要它在列表中,只需迭代(如果没有数据,你将永远不会进入循环体)
  • Where永远不会返回null

换句话说,我可能会写:

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