将结果提取到List时,LINQ的执行速度是否较慢?

时间:2011-01-20 13:56:37

标签: c# linq

我有以下LINQ语句,我发现它没有像我想的那样快速运行。是否存在运行速度更快的其他变体,或者还有其他更快的方法吗?

var products = session.Products.Where(x => x.Supplier.Address.State == "HI").ToList();

6 个答案:

答案 0 :(得分:5)

您未说明的是,这是针对特定LINQ提供商的博客文章。让我们把它放在上下文中:

  

现在查询它:

using(var session=new Session()){
   var products = session.Products.Where(x => x.Supplier.Address.State == "HI")
                                  .ToList();
}
  

......它有效:)这就是ObjectDatabase世界中所谓的“深度图”查询,通常会给性能带来麻烦。说实话,我还没有将这个查询挂在多个记录上 - 但是从我读过的内容来看,这对Mongo来说是正常的,并且它支持得很好。

这不是对ToList的调用“通常会给性能带来麻烦” - 事实上你正在对象数据库中进行“深度图查询”。是的,然后您将所有结果提取到内存中,但这是商店的本质,这是引起关注的原因。

答案 1 :(得分:2)

  

为什么这句话“通常是咒语   性能问题“

没有。

答案 2 :(得分:2)

为什么你认为这个相当常见的LINQ表达式对性能有影响?此类声明应得到某种形式的性能分析的支持。

虽然LINQ表达式方法本身很简单,但我会看一下Supplier.Address.State链的实现。这些属性是否需要进行大量工作才能进行评估?

更新:鉴于这是针对MongoDB存储库的查询以及您查询每个产品的事实,查看供应商地址状态的值,会让您“深入”3个级别“在对象图中。在提供程序中没有任何智能的情况下,强制数据库加载每个“级别”。实际上,对于每个Product,除了Product对象本身之外,您实际上是在加载供应商和地址。

答案 3 :(得分:0)

你可以这样做:

var products =
    (from product in session.Products
    where product.Supplier.State == "HI"
    select product).ToList();

但这只是为了可读性。我认为表现不是问题。

答案 4 :(得分:0)

session.Products中有多少项? 这个表达式被调用了多少次?

我们在项目中广泛使用Linq,但有一次在关键代码中,我们不得不用标准的foreach运算符重写相似的表达式。我们的清单包含大约10-20个项目,但它被称为50000-70000次。我们将时间成本从大约0.3秒减少到0.001秒。

在一般用例中(例如,在网页上显示产品),您的样本不会影响性能。

答案 5 :(得分:0)

使用ToList()会立即执行你的语句,如果没有ToList()你的查询将被推迟,直到你引用'products'变量。但从表现预期来看,他们会是一样的。如果您遇到一些性能问题,请尝试并行化查询

var products = session.Products.AsParallel().Where(x => x.Supplier.Address.State == "HI").ToList();

但是现在您的列表可能与之前的顺序不同,因此如果订单很重要,您可以使用AsOrdered()

var products = session.Products.AsParallel().AsOrdered().Where(x => x.Supplier.Address.State == "HI").ToList();