【问题标题】:Alternative for LINQ's .Contains() [duplicate]替代 LINQ 的 .Contains() [重复]
【发布时间】:2014-02-15 03:44:11
【问题描述】:

我正在寻找一些技巧来提高我的实体框架查询性能并且遇到了this useful article

本文作者提到以下几点:

08 避免使用包含

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

我还有哪些更快的替代方案?

【问题讨论】:

  • 如果您发布代码 sn-p 显示您如何使用它可能会有所帮助。
  • 先做基准...然后再担心。
  • 我知道这不是 Contains() 的替代方法。有 StartsWith() 和 EndsWith() 方法。
  • 除此之外,我能想到的就是正则表达式。我不知道这是否会提高性能。
  • 这一切都取决于你使用Contains的上下文...

标签: c# sql performance linq entity-framework


【解决方案1】:

包含对您想要的场景完全有效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
)

【讨论】:

    【解决方案2】:

    它非常依赖于上下文,您应该关注的不是避免.Contains(),而是如何在 SQL 中避免WHERE xx IN yy。你能代替加入吗?是否可以指定一个区间而不是离散值?

    这里有一个完美的例子:Avoid SQL WHERE NOT IN Clause

    在哪里可以通过使用连接来避免它。

    我会说WHERE xx IN yy 通常只是一个解决方案的一半,通常你真正想要的是其他东西,你只到达一半而不是直接去那里,就像在加入的情况下一样。

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2013-08-06
      相关资源
      最近更新 更多