LINQ的.Contains()的替代方法是什么?

6
我正在寻找一些改善实体框架查询性能的技巧,偶然发现了 这篇有用的文章
该文章的作者提到了以下内容:

08 避免使用 Contains

在 LINQ 中,我们使用 contains 方法来检查存在性。它会被转换为 SQL 中的 "WHERE IN",从而导致性能下降。

那么,还有哪些更快的替代方法呢?

如果您发布一个代码片段展示如何使用它,可能会有所帮助。 - Steven Mills
1
先进行基准测试,然后再考虑它。 - Simon Whitehead
1
我知道这不是Contains()的替代方法。有StartsWith()和EndsWith()方法。 - ElectricRouge
1
除此之外,我所能想到的类似的东西就是正则表达式。我不知道它是否会提高性能。 - ElectricRouge
1
这完全取决于您使用 Contains 的上下文... - James
显示剩余5条评论
2个回答

2

包含操作可以在需要使用 WHERE IN 的场景中完美地使用。

例如:

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

gets (essentially) converted to

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

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

例如:

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
这非常依赖于上下文,你应该关注的不是避免使用.Contains(),而是如何避免在SQL中使用WHERE xx IN yy。你能使用连接吗?是否可以指定间隔而不是离散值?
这里有一个完美的例子:避免使用 SQL WHERE NOT IN 子句 在这个例子中,可以通过使用连接来避免使用WHERE NOT IN
我认为WHERE xx IN yy通常只是半个解决方案,通常你真正想要的是其他东西,而你只完成了一半,而不是直接去完成它,就像连接的情况一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接