C# 将结果提取到列表时,LINQ是否执行得较慢?

C# 将结果提取到列表时,LINQ是否执行得较慢?,c#,linq,C#,Linq,我有下面的LINQ声明,我发现它没有像我希望的那样快速运行。是否有其他运行速度更快的变体,或者是否有其他更快的方法 var products = session.Products.Where(x => x.Supplier.Address.State == "HI").ToList(); 为什么这句话“通常意味着 “性能问题” 它没有。为什么您认为这种相当常见的LINQ表达式会影响性能?这种说法应该得到某种形式的性能分析的支持 虽然LINQ表达式方法本身相当简单,但我将研究Supplie

我有下面的LINQ声明,我发现它没有像我希望的那样快速运行。是否有其他运行速度更快的变体,或者是否有其他更快的方法

var products = session.Products.Where(x => x.Supplier.Address.State == "HI").ToList();
为什么这句话“通常意味着 “性能问题”


它没有。

为什么您认为这种相当常见的LINQ表达式会影响性能?这种说法应该得到某种形式的性能分析的支持

虽然LINQ表达式方法本身相当简单,但我将研究
Supplier.Address.State
链的实现。这些属性是否需要进行大量评估


更新:考虑到这是对MongoDB存储库的查询,并且您正在查询每个产品,查看供应商地址状态的值,使您在对象图中有3个“深度”。在提供程序中没有任何智能性的情况下,强制数据库加载每个“级别”。实际上,对于每个
产品
,除了产品对象本身之外,您实际上正在加载供应商和地址。

您可以这样做:

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

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

会话中有多少项。产品? 这个表达式被调用了多少次

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


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

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

现在查询一下:

…而且有效:)。这就是ObjectDatabase世界中所谓的“深度图”查询,通常会给性能带来麻烦。老实说,我还没有将这个查询与多个记录挂钩——但从我所读到的内容来看,这对于Mongo来说是正常的,并且它非常支持它

不是调用
ToList
“通常会给性能带来麻烦”——而是在对象数据库中执行“深度图查询”。是的,然后将所有结果提取到内存中,但这是存储的性质,这是这里需要关注的问题。

使用ToList()将立即执行语句,如果您的查询没有ToList(),则执行将推迟到您引用'products'变量。但从性能角度来看,它们是一样的。如果您有一些性能问题,请尝试并行化查询

var products = session.Products.AsParallel().Where(x => x.Supplier.Address.State == "HI").ToList();
但是,现在您的列表的顺序可能与以前不同,所以如果顺序很重要,您可以使用AsOrdered()


为什么你认为这会给表演带来麻烦?(我不是说没有,但是你的帖子没有给出任何关于实际基准测试与非LINQ操作的等价性的指示)。我看不出有什么问题。你有性能评论的来源吗?Rahwi,这听起来像是你在什么地方读到的…你能链接到这篇文章吗?你能给我解释一下“深度图查询”吗。或者读一些有用的文章。我会很感激的。@Rawhi:我只是引用了你链接到的那篇文章。询问MongoDB专家:)
var products = session.Products.AsParallel().Where(x => x.Supplier.Address.State == "HI").ToList();
var products = session.Products.AsParallel().AsOrdered().Where(x => x.Supplier.Address.State == "HI").ToList();