Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Sql server 实体框架:最大数量的;子查询";?_Sql Server_Linq_Entity Framework - Fatal编程技术网

Sql server 实体框架:最大数量的;子查询";?

Sql server 实体框架:最大数量的;子查询";?,sql-server,linq,entity-framework,Sql Server,Linq,Entity Framework,我的数据模型有一个实体Person,其中有3个相关(1:N)实体Jobs,Tasks和Dates 我的问题看起来像 var persons = (from x in context.Persons select new { PersonId = x.Id, JobNames = x.Jobs.Select(y => y.Name), TaskDates = x.Tasks.Select(y => y.Date), DateInfos = x.Dates

我的数据模型有一个实体
Person
,其中有3个相关(1:N)实体
Jobs
Tasks
Dates

我的问题看起来像

var persons = (from x in context.Persons
select new {
    PersonId = x.Id,
    JobNames = x.Jobs.Select(y => y.Name),
    TaskDates = x.Tasks.Select(y => y.Date),
    DateInfos = x.Dates.Select(y => y.Info)
}).ToList();
似乎一切正常,但列表中的
JobNames
TaskDates
DateInfos
并没有全部填写

例如,
TaskDates
DateInfos
具有正确的值,但
JobNames
保持为空。但是,当我从查询中删除
TaskDates
时,
JobNames
已正确填充

所以EF似乎只能处理有限数量的这些“子查询”?这是正确的吗?如果是,单个语句的这些“子查询”的最大数量是多少?有没有一种方法可以解决这些问题,而不必对数据库进行多次调用

(注:我不完全确定,但我似乎记得这个查询在LINQ2SQL中工作过——可能吗?)

更新

我对这件事越来越着迷了。我试图用一个新的、简单的项目从头开始重新编写这个问题(在这里发布整个代码段,而不仅仅是一个过于简单的示例),但我发现我无法重新编写。它仍然发生在我们现有的代码库中(很显然,这个问题背后还有更多问题,但不幸的是,我不能共享这个封闭的代码库)

在玩了好几个小时后,我发现了最奇怪的行为:

  • 当我不
    将事务隔离级别设置为readuncommitted时,它非常有效
  • 当我不使用
    .Take()
    仅获取前X行时,它也非常有效(与上述内容无关)
  • 当我添加一个额外的
    .Where()
    语句来减少从SQL Server返回的行数时,它也非常有效
我没有找到任何可以理解的原因来解释我为什么会看到这种行为,但我开始研究SQL:虽然EF生成完全相同的SQL,但当我使用
READ UNCOMMITTED
时,执行计划是不同的。它在执行计划中间的特定索引上返回更多的行,奇怪的是,在整个SQL语句返回的较少行中结束,这导致数据丢失,这就是我的问题开始的原因。

我知道,这听起来非常令人困惑和难以置信,但这就是我看到的行为。我不知道还能做什么,我甚至不知道在这一点上用谷歌搜索什么;-)


我可以修复我的问题(只是不使用
读取未提交的
),但我不知道为什么会发生这种情况,也不知道它是一个bug还是关于SQL Server的一些我不知道的东西SQL Server中可能有一些“子查询中允许的最大结果数”?至少:据我所知,这不是EF本身的问题

有点晚了,但是对每个子查询调用ToList()会产生所需的效果吗

var persons = (from x in context.Persons
select new {
    PersonId = x.Id,
    JobNames = x.Jobs.Select(y => y.Name.ToList()),
    TaskDates = x.Tasks.Select(y => y.Date).ToList(),
    DateInfos = x.Dates.Select(y => y.Info).ToList()
}).ToList();

查看
var persons=(从上下文中的x开始,persons选择new{PersonId=x.Id,JobNames=x.Jobs.select(y=>y.Name),TaskDates=x.Tasks.select(y=>y.Date),DateInfos=x.Dates.select(y=>y.Info)}.ToString()
并分析sql。你能不能试试:JobNames=context.Jobs.Where(j=>j.Person.Id==x.Id)。选择(j=>j.Name)我的猜测是1)查询需要
MultipleActiveResultSets=True2)实体的架构未正确构建您是否尝试过使用
Include
?感谢您的建议-请参阅上面的更新。Jon,感谢您的建议。是的,我试过
ToList()
。不,没用,结果还是一样。我认为我的问题源于SQL Server,而不是EF(请参阅我的更新)。