我正在寻找一些改进我的实体框架查询性能的技巧,并且来自this useful article。
本文作者提到了以下内容:
08避免使用包含
在LINQ中,我们使用contains方法来检查存在。它在SQL中转换为“WHERE IN”,导致性能下降。
我还有哪些更快的选择呢?
答案 0 :(得分:2)
包含对于您想要的方案WHERE IN
EG:
var q = from p in products where new[]{1,50,77}.Contains(p.productId) select p;
(基本上)转换为
SELECT * FROM products WHERE ProductId IN (1,50,77)
但是如果你要检查是否存在,我会建议你使用.Any(),它会被转换为EXISTS -
EG
var q = from p in products
where p.productsLinkGroups.Any(x => x.GroupID == 5)
select p
获取(或多或少)隐蔽的:
SELECT * FROM products p
WHERE EXISTS(
SELECT NULL FROM productsLinkGroups plg
WHERE plg.GroupId = 5 AND plg.ProductId = p.ProductId
)
答案 1 :(得分:1)
它非常依赖于上下文,您应该注意的不是避免.Contains()
,而是如何避免SQL中的WHERE xx IN yy
。你可以加入吗?是否可以指定间隔而不是离散值?
这里提供了一个完美的例子:Avoid SQL WHERE NOT IN Clause
可以通过使用连接来避免它。
我会说WHERE xx IN yy
通常只是解决方案的一半,通常你真正想要的是别的东西,而你只能到达那里而不是直接去那里,就像加入一样。