我的数据模型有一个实体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只能处理有限数量的这些“子查询”?它是否正确?如果是这样,最大值是多少。单个陈述的这些“子查询”的数量?有没有办法解决这些问题,而不必多次调用数据库?
(ps:我不完全确定,但我似乎记得这个查询在LINQ2SQL中有效 - 可能是吗?)
更新
我对此感到疯狂。我尝试使用一个简单的新项目从头开始重新编写问题(在这里发布整段代码,不仅仅是一个过于简单的例子) - 我发现我无法重复它。它仍然发生在我们现有的代码库中(显然这个问题背后有更多,但不幸的是我无法共享这个封闭的代码库)。
经过几个小时的游戏,我发现了最奇怪的行为:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
时,它很有效。.Take()
来获取前X行.Where()
语句来减少从SQL Server返回的行数时,它也很有用我没有找到任何可理解的原因,为什么我看到这种行为,但我开始查看SQL:虽然EF生成完全相同的SQL,但是当我使用READ UNCOMMITTED
时执行计划是不同的。它在执行计划中间的特定索引上返回 more 行,这奇怪地以为整个SQL语句返回的 less 行结束 - 这反过来导致丢失数据,这就是我的问题开始的原因。
这听起来非常令人困惑和难以置信,我知道,但这是我看到的行为。我不知道还能做什么,我现在甚至都不知道google的用处; - )。
我可以解决我的问题(只是不要使用READ UNCOMMITTED
),但我不知道它为什么会发生,如果它是一个bug或者我不了解SQL Server的东西。 可能在SQL Server 中有一些“子查询中允许的最大结果数”?至少:据我所知,这不是EF本身的问题。
答案 0 :(得分:0)
有点晚了,但是在每个子查询上调用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();