实体框架:Max。 “子查询”的数量?

时间:2013-12-17 08:24:46

标签: sql-server linq entity-framework

我的数据模型有一个实体Person,包含3个相关(1:N)实体JobsTasksDates

我的查询看起来像

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();

所有内容似乎都运行良好,但JobNamesTaskDatesDateInfos列表并未全部填充。

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

所以看来EF只能处理有限数量的这些“子查询”?它是否正确?如果是这样,最大值是多少。单个陈述的这些“子查询”的数量?有没有办法解决这些问题,而不必多次调用数据库?

(ps:我不完全确定,但我似乎记得这个查询在LINQ2SQL中有效 - 可能是吗?)

更新

我对此感到疯狂。我尝试使用一个简单的新项目从头开始重新编写问题(在这里发布整段代码,不仅仅是一个过于简单的例子) - 我发现我无法重复它。它仍然发生在我们现有的代码库中(显然这个问题背后有更多,但不幸的是我无法共享这个封闭的代码库)。

经过几个小时的游戏,我发现了最奇怪的行为:

  • 在调用LINQ语句之前 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本身的问题。

1 个答案:

答案 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();