【问题标题】:Linq statement that queries field by multiple values gets converted to in statement通过多个值查询字段的 Linq 语句被转换为 in 语句
【发布时间】:2015-07-06 23:11:06
【问题描述】:

我有一个这样的 linq 语句:

this.DataContext.TableName.Where(r => r.Field =="REQUEST" || r.Field== "UPDATE")

转换成sql后的语句如下:

 WHERE ([Extent1].[Field] IN (N'REQUEST',N'UPDATE'))

而不是:

WHERE Field = 'REQUEST' or Field = 'UPDATE'

底部示例的运行速度是顶部示例的两倍。有没有人能指出我正确的方向,以使转换后的 SQL 看起来像下面的示例。

我正在使用 C# ASP.Net MVC 5、EF6,但无论我尝试什么都给出相同的结果并使用 IN 语句。

【问题讨论】:

  • 嗨,您能否发布对两个查询的执行计划的评估,以比较它们是否以不同的方式运行。我认为两者都将以相同的方式运行,但请检查执行计划并发布图像。
  • 你试过(r.Field == "REQUEST") || (r.Field == "UPDATE") 吗?另外,我倾向于同意@Juan。

标签: c# linq entity-framework


【解决方案1】:

我将 LINQPad4 用于:

Customers.Where(x => x.Name == "Tom" || x.Name == "Dick").Dump()

生成:

-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'Tom'
DECLARE @p1 NVarChar(1000) = 'Dick'
-- EndRegion
SELECT [t0].[ID], [t0].[Name]
FROM [Customer] AS [t0]
WHERE ([t0].[Name] = @p0) OR ([t0].[Name] = @p1)

这里讨论了 IN 与 OR:IN vs OR in the SQL WHERE Clause

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在这种情况下,如果您关心的是性能是否良好,那么您需要阅读大量文章来发表自己的看法。有一次,您可能不得不担心您的列是否需要和索引,以及您的统计信息是否已更新。

    如果您的值是作为字符串请求和更新的,请评估您是否需要一个相关表来保存这些值,并在您的表中具有一个具有整数值的相关 id。这个 int 列可以有一个索引,这将提供更好的性能和更小的数据和索引大小。

    LINQ 将尝试根据您的数据库结构提供最佳执行。因此,例如,如果您在数据库中提供了良好的设计,那么在大多数情况下,您不必担心 linq 查询的结果 sql 是什么。 (在大查询和大数据库中总是做这个检查,并检查执行计划)

    【讨论】:

    • 检查查询计划后,我意识到 IN 语句必须进行隐式转换,因为它是 Varchar 列,并且 linq 创建要搜索的值作为 N'REQUEST' 因此转换为 nvarchar必须执行。这让我想知道有多少其他地方的性能是由这个组成的,因为我继承的数据库有很多 varchar 字段。感谢您朝正确的方向轻推。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多