我有以下LINQ语句,我发现它没有像我想的那样快速运行。是否存在运行速度更快的其他变体,或者还有其他更快的方法吗?
var products = session.Products.Where(x => x.Supplier.Address.State == "HI").ToList();
答案 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();