Linq计数方法及其性能

Linq计数方法及其性能,linq,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.Coun

我在我的项目中广泛使用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方法从数据库中获取数据 List lstpack=新列表()

var accessor=\u sqlDatabase.CreateSprocAccessor(“PackageForClientApp”,MapBuilder
.MapAllProperties()
.Build()
);
var Data=accessor.Execute(startdate、enddate、beinh);
如果(Data!=null)/&&Data.Count()>0//则在执行额外提取时已将其删除
lstpack=Data.ToList();

现在返回列表

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

  • 是的,它们可能是完全独立的操作
  • 通常,使用
    Any()
    而不是
    Count()>0
    ;它可以更加高效,尤其是在LINQ to对象中
  • 当列表为空时,调用
    ToList
    将相对便宜-如果需要列表,就这样做
  • 如果列表中不需要它,只需迭代即可(如果没有数据,就永远不会进入循环体)
  • 其中
    永远不会返回null
换句话说,我可能会写:

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

伟大的谢谢,这里的getData是Enterprise Library 5.0的结果集返回的对象列表,令人惊讶的是它执行了两次存储过程,一次是在调用getData的Count方法时,另一次是在使用ToList时。@Deepesh:为什么你会惊讶于看到这一点
getData
不是对象列表,而是查询。调用
ToList
将其转换为对象列表。是的,它会,但我惊讶地看到数据库操作被执行了两次,一次用于Count,另一次用于list。表示存储过程执行两次,理想情况下,在执行Count时,结果集应该进入内存,而在执行ToList()时,不会再次执行called@Deepesh:如果要将所有结果存入内存,这正是
ToList
的目的。一些LINQ提供程序将在上下文中缓存查询结果,但这取决于相关提供程序的详细信息。非常感谢@Jon在这方面帮助我,并消除了我对此的疑虑。再次感谢
foreach (Obj xyz in objData.Where(obj => !obj.isDelete))
{
   //some operation
}