C# 按多个值查询字段的Linq语句转换为in语句
我有这样一个linq声明:C# 按多个值查询字段的Linq语句转换为in语句,c#,linq,entity-framework,C#,Linq,Entity Framework,我有这样一个linq声明: this.DataContext.TableName.Where(r => r.Field =="REQUEST" || r.Field== "UPDATE") WHERE ([Extent1].[Field] IN (N'REQUEST',N'UPDATE')) 转换为sql时的语句如下所示: this.DataContext.TableName.Where(r => r.Field =="REQUEST" || r.Field== "UPDATE
this.DataContext.TableName.Where(r => r.Field =="REQUEST" || r.Field== "UPDATE")
WHERE ([Extent1].[Field] IN (N'REQUEST',N'UPDATE'))
转换为sql时的语句如下所示:
this.DataContext.TableName.Where(r => r.Field =="REQUEST" || r.Field== "UPDATE")
WHERE ([Extent1].[Field] IN (N'REQUEST',N'UPDATE'))
而不是:
WHERE Field = 'REQUEST' or Field = 'UPDATE'
底部示例的运行速度是顶部示例的两倍。是否有人能够为我指出正确的方向,以使转换后的SQL看起来像下面的示例
我使用的是C#ASP.Net MVC 5,EF6,但无论我尝试什么,都只会给出相同的结果并使用IN语句。我使用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)
在vs或中,此处讨论:
希望这能有所帮助。在这种情况下,如果您关心的是性能良好,那么您需要阅读一大串文章,以获得自己的意见。这一次,您可能需要考虑您的列是否需要索引,以及是否更新了统计数据 如果您的值是作为字符串请求和更新的,请评估是否需要一个相关表来保存此值,以及表中是否有一个具有整数值的相关id。这个int列可以有一个索引,这将在数据和索引大小方面提供更好的性能和更小的占用空间
LINQ将尝试根据您的数据库结构提供最佳执行。因此,例如,如果您在数据库中提供了一个良好的设计,那么在大多数情况下,您不必担心linq查询的sql结果是什么。(无论是在大型查询中还是在大型数据库中,都要进行此检查,并检查执行计划)Hi您可以发布两个查询的执行计划评估,以比较它们是否以不同的方式运行。在我看来,两者都将以相同的方式运行,但是检查执行计划并发布一个图像。您是否尝试过
(r.Field==“REQUEST”)|(r.Field==“UPDATE”)
?此外,我倾向于同意@Juan。在检查查询计划后,我意识到IN语句必须进行隐式转换,因为它是一个Varchar列,linq创建值以作为N'REQUEST'进行搜索,因此必须执行到nvarchar的转换。这让我想知道,由于我继承的数据库有很多varchar字段,还有多少其他地方的性能是由它组成的。谢谢你朝着正确的方向轻推。