Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EF:在LINQ查询中使用Contains时,SQL输出是什么?_Sql_Entity Framework_Nhibernate - Fatal编程技术网

EF:在LINQ查询中使用Contains时,SQL输出是什么?

EF:在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

在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 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语句复制到这个答案中。