EF:在LINQ查询中使用Contains时,SQL输出是什么?
在NHibernate中,当我们执行下面的查询时,为其生成的SQL将包含集合中每个元素的参数。如果对MSSQL Server执行查询,并且集合中有2k或更多元素,则会出现错误,因为sql引擎允许的最大参数为2kEF:在LINQ查询中使用Contains时,SQL输出是什么?,sql,entity-framework,nhibernate,Sql,Entity Framework,Nhibernate,在NHibernate中,当我们执行下面的查询时,为其生成的SQL将包含集合中每个元素的参数。如果对MSSQL Server执行查询,并且集合中有2k或更多元素,则会出现错误,因为sql引擎允许的最大参数为2k var bankaccounts = from b in this.unitOfWork.BankAccounts where command.Ids.Contains(b.Id) // command.ids is an array with i
var bankaccounts = from b in this.unitOfWork.BankAccounts
where command.Ids.Contains(b.Id) // command.ids is an array with id's
select b;
很抱歉,我自己懒得用EntityFramework测试这一点,但我看到其他开发人员正在编写这样的代码:
问题是EF将为此类查询生成什么样的SQL?我已经为您观看了SQL profiler。这就是实体框架中发生的情况(我想这也是wat NHibernate的产品,但我不确定..):
如您所见,它将成为一个
WHERE。。在([contains values])
中,我为您观看了SQL profiler。这就是实体框架中发生的情况(我想这也是wat NHibernate的产品,但我不确定..):
如您所见,它将成为一个WHERE。。在([contains values])
中,使用此查询
var ids = context.Countries
.Take(10).Select(c => c.CountryId).ToList();
var offices = context.Offices.Where(o => ids.Contains(o.CountryId))
.ToList();
它将生成以下SQL:
SELECT
[Extent1].[OfficeId] AS [OfficeId],
[Extent1].[CountryId] AS [CountryId],
[Extent1].[OfficeName] AS [OfficeName]
FROM [dbo].[Office] AS [Extent1]
WHERE [Extent1].[CountryId] IN (3,4,5,6,7,8,9,10,11,12)
有了这个疑问,
var ids = context.Countries
.Take(10).Select(c => c.CountryId).ToList();
var offices = context.Offices.Where(o => ids.Contains(o.CountryId))
.ToList();
它将生成以下SQL:
SELECT
[Extent1].[OfficeId] AS [OfficeId],
[Extent1].[CountryId] AS [CountryId],
[Extent1].[OfficeName] AS [OfficeName]
FROM [dbo].[Office] AS [Extent1]
WHERE [Extent1].[CountryId] IN (3,4,5,6,7,8,9,10,11,12)
您可以使用SQL Management Studio的SQL Profiler查看生成的SQL脚本您可以使用SQL Management Studio的SQL Profiler查看生成的SQL脚本您可以确认此处的“4,5,6,7,9”中的数字没有作为参数传递吗?如果他们不是,听起来EF处理这个场景非常糟糕:(10倍用于检查我的这个。不,他们没有作为参数传入。我已经从SQL Provider复制了SQL语句到这个答案中。你能确认这里的数字在(4,5,6,7,9)中吗'不是作为参数传递的吗?如果不是,听起来EF对这种情况的处理非常糟糕:(10倍用于检查我的答案。不,它们不是作为参数传递的。我已将SQL Provider中的SQL语句复制到这个答案中。