【问题标题】:Entity Framework List Contains in lambda实体框架列表包含在 lambda
【发布时间】:2015-09-23 17:02:44
【问题描述】:

我想使用特定 ID 查询项目。例如:

var ids = new List<int> { 1, 3, 5 };

var items = context.Items.Where(item => ids.Contains(item.ID)).ToList();

问题:

  1. 这是否会使用 SQL IN 运算符生成单个查询?
  2. 这段代码在性能方面可以吗?
  3. 有没有更好的方法?

我正在使用带有 Microsoft SQL Server 的 Entity Framework 6。

【问题讨论】:

  • 是的,EF6 支持 Contains() 并将被翻译为 IN。我认为没有比这更高效的方法了。
  • 视情况而定。如果此列表也来自数据库,那么处理它的最佳方法是 SQL 中的连接语句而不是 IN,这可以使用 EF 中的几种不同技术来完成(.Any 就是其中之一)。如果列表很小,那么性能通常不是问题,如果列表很长,则可能会导致性能问题。
  • 我想说没有更简单的方法可以做到这一点。性能可能会更差,具体取决于您的数据库、查询的复杂性(连接、分组等)以及本地列表的大小。我会通过尽可能设计数据库来避免使用本地列表。如果使用本地列表,则应具有较小的大小。

标签: c# .net entity-framework linq entity-framework-6


【解决方案1】:
  1. 这是否会使用 SQL IN 运算符生成单个查询?
    是的
  2. 这段代码在性能方面可以吗?
    是(适用于小型列表)
  3. 有没有更好的方法?
    否(对于小型列表)

如果列表真的很大并且表相当小,您可能会获得更好的性能,将完整的表放入内存并与列表进行内存连接。

【讨论】:

  • 只有在提供程序支持的情况下才会生成 SQL IN。 Sql Server 提供程序支持它,但 Oracle 提供程序不支持
  • 对我来说,这会将整个表带入,然后从内存中获取它需要的值。考虑到该表有大约 1500 万行,这会严重影响性能。它几乎可以在没有IN 的情况下执行SELECT * FROM 查询。
  • @DouglasGaskell 也许您使用的是旧版本的 EF。或者使用非 SQL-Server 提供程序。
  • @Magnus 我现在正在使用 EF Core (7)。我可能缺少这种功能。
  • 嗨@DouglasGaskell。如果您使用的是 EF Core 3.1+,您可能会发现我的工作很有用:github.com/yv989c/BlazarTech.QueryableValues
猜你喜欢
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多