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时,它非常有效调用LINQ语句之前的代码>
- 当我不使用
仅获取前X行时,它也非常有效(与上述内容无关).Take()
- 当我添加一个额外的
语句来减少从SQL Server返回的行数时,它也非常有效.Where()
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=True代码>2)实体的架构未正确构建您是否尝试过使用Include
?感谢您的建议-请参阅上面的更新。Jon,感谢您的建议。是的,我试过ToList()
。不,没用,结果还是一样。我认为我的问题源于SQL Server,而不是EF(请参阅我的更新)。