关于c#:LINQ的.Contains()的替代方法

Alternative for LINQ's .Contains()

本问题已经有最佳答案,请猛点这里访问。

我一直在寻找一些技巧来提高我的实体框架查询性能,并发现这篇有用的文章。

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

08 Avoid using Contains

In LINQ, we use contains method for checking existence. It is converted to"WHERE IN" in SQL which cause performance degrades.

还有哪些更快的替代品供我使用?


包含对于您想要WHERE IN

的情况完全有效

EG:

1
var q = from p in products where new[]{1,50,77}.Contains(p.productId) select p;

(基本上)被转换为

1
SELECT * FROM products WHERE ProductId IN (1,50,77)

但是,如果您要检查是否存在,我建议您使用.Any(),它将转换为EXISTS-

EG

1
2
3
var q = from p in products
           where p.productsLinkGroups.Any(x => x.GroupID == 5)
           select p

(或多或少)被掩盖至:

1
2
3
4
5
SELECT * FROM products p
WHERE EXISTS(
  SELECT NULL FROM productsLinkGroups  plg
  WHERE plg.GroupId = 5 AND plg.ProductId = p.ProductId
)

这是非常依赖于上下文的,您应该注意的不是避免使用.Contains(),而是如何避免在SQL中使用WHERE xx IN yy。您可以参加吗?是否可以指定间隔而不是离散值?

此处提供了一个完美的示例:避免在子句中不使用SQL

可以通过使用联接来避免这种情况。

我想说的是WHERE xx IN yy通常只是解决方案的一半,通常您真正想要的是其他东西,而且您只能到达一半,而不是直接进入那里,例如在连接的情况下。