替代LINQ的.Contains()

时间:2014-01-24 08:22:53

标签: c# sql performance linq entity-framework

我正在寻找一些改进我的实体框架查询性能的技巧,并且来自this useful article

本文作者提到了以下内容:

  

08避免使用包含

     

在LINQ中,我们使用contains方法来检查存在。它在SQL中转换为“WHERE IN”,导致性能下降。

我还有哪些更快的选择呢?

2 个答案:

答案 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通常只是解决方案的一半,通常你真正想要的是别的东西,而你只能到达那里而不是直接去那里,就像加入一样。