gpt4 book ai didi

sql-server - Entity Framework : Max. "subqueries"的数量?

转载 作者:行者123 更新时间:2023-12-02 20:24:33 27 4
gpt4 key购买 nike

我的数据模型有一个实体 Person与 3 个相关 (1:N) 实体 Jobs , TasksDates .

我的查询看起来像

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 , TaskDatesDateInfos还没有全部填满。

例如,TaskDatesDateInfos有正确的值,但是 JobNames保持空状态。但是当我删除TaskDates时从查询中,然后 JobNames已正确填写。

看来 EF 只能处理有限数量的这些“子查询”?它是否正确?如果是这样,最大值是多少?单个语句的这些“子查询”的数量?有没有一种方法可以解决这些问题,而无需多次调用数据库?

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

更新

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

经过几个小时的玩耍后,我发现了最奇怪的行为:

  • 当我不这样做时,它效果很好 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;在调用 LINQ 语句之前
  • 当我使用 .Take() 时,它也能很好地工作(与上述无关)仅获取前 X 行
  • 当我添加额外的 .Where() 时,效果也很好。用于减少从 SQL Server 返回的行数的语句

我没有找到任何可以理解的原因来解释为什么我会看到这种行为,但我开始查看 SQL:虽然 EF 生成完全相同的 SQL,但当我使用 READ UNCOMMITTED 时,执行计划是不同的。 。它在执行计划中间的特定索引上返回更多行,奇怪的是,这以整个 SQL 语句返回更少行结束 - 这反过来又导致缺失数据,这就是我提出问题的原因。

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

我可以解决我的问题(只是不要使用 READ UNCOMMITTED ),但我不知道它为什么会发生,也不知道它是否是一个错误或我不了解 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();

关于sql-server - Entity Framework : Max. "subqueries"的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20629206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com