【问题标题】:Linq Count method and PerformanceLinq Count 方法和性能
【发布时间】:2011-09-16 13:19:39
【问题描述】:

我在我的项目中广泛使用 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() 时的延迟加载概念,然后不对 .ToList 执行任何操作。

如果不是,那么我应该删除 Count 条件,它会提高性能吗?

我正在使用 Enterprise Library 5.0 访问器方法从数据库中获取数据 列表 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>();

现在返回列表

【问题讨论】:

    标签: linq


    【解决方案1】:

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

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

    换句话说,我可能会写:

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

    【讨论】:

    • 太棒了!谢谢,这里的getData是Enterprise Library 5.0的结果集返回的对象列表,惊讶地发现它执行了两次存储过程,一次是我们调用getData的Count方法,另一次是在使用ToList时。
    • @Deepesh:你为什么惊讶地看到这一点? getData 不是对象列表——它是一个查询。调用 ToList 会将其转换为对象列表。
    • 是的,但我很惊讶地看到数据库操作被执行了两次,一次用于计数,另一次用于列表。意味着存储过程执行了两次,理想情况下,当 Count 被执行时,结果集应该进入内存,并且在调用 ToList() 时不会再次执行
    • @Deepesh:如果你想把所有的结果都存入内存,这正是ToList 的用途。 一些 LINQ 提供程序会在上下文中缓存查询结果,但这取决于相关提供程序的详细信息。
    • 非常感谢@Jon 帮助我解决这个问题。再次感谢
    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2011-06-09
    • 2015-12-14
    • 2012-06-24
    相关资源
    最近更新 更多