当前位置: 首页 > 知识库问答 >
问题:

EF Core 2.0.2为子查询生成多个查询

王翰墨
2023-03-14

我不确定这是否是一个错误,但我遇到了一些主要的性能问题。EF Core正在为一个简单的语句生成多个查询。

这是查询:

        var query = (from task in db.Tasks
                     let LastStatus = task.TaskStatus.Where(x => x.Deleted == false).OrderByDescending(x => x.CreatedDate).Select(x => x.Status.Name).First()
                     select new
                     {
                         task.Id,
                         LastStatus
                     }).ToList();

预期结果:

SELECT [t0].[Id], (
    SELECT TOP (1) [t2].[Name]
    FROM [TaskStatus] AS [t1]
    INNER JOIN [Status] AS [t2] ON [t2].[Id] = [t1].[StatusId]
    WHERE ([t1].[TaskId] = [t0].[Id]) AND (NOT ([t1].[Deleted] = 1))
    ORDER BY [t1].[CreatedDate] DESC
    ) AS [LastStatus]
FROM [Tasks] AS [t0]

然而,EF正在生成:

SELECT TOP(1) [x.Status0].[Name]
FROM [TaskStatus] AS [x0]
INNER JOIN [Status] AS [x.Status0] ON [x0].[StatusId] = [x.Status0].[Id]
WHERE ([x0].[TaskId] = @_outer_Id) AND ([x0].[Deleted] = 0)
ORDER BY [x0].[CreatedDate] DESC
Microsoft.EntityFrameworkCore.Database.Command:Information: Executed DbCommand (0ms) [Parameters=[@_outer_Id='?'], CommandType='Text', CommandTimeout='30']
SELECT TOP(1) [x.Status0].[Name]
FROM [TaskStatus] AS [x0]
INNER JOIN [Status] AS [x.Status0] ON [x0].[StatusId] = [x.Status0].[Id]
WHERE ([x0].[TaskId] = @_outer_Id) AND ([x0].[Deleted] = 0)
ORDER BY [x0].[CreatedDate] DESC

UPDATE用EF core 2.1.0-preview2-Final测试过还是一样的问题

共有1个答案

姜嘉赐
2023-03-14
  1. 升级到EF 2.0.2到EF核心2.1.0-预览2-最终
  2. 使用FirstOrDefault()而不是First(),
  3. 不要使用let("当使用let定义的子查询多次出现时存在已知问题")请参阅https://github.com/aspnet/EntityFrameworkCore/issues/11677详细信息
 类似资料:
  • 问题内容: 桌子: 我的查询: 我收到“ MySQL子查询返回多个行”错误。 我知道此查询可以使用以下查询的解决方法: 然后使用php循环遍历结果并执行以下查询以获取和回显它: 但是我认为可能会有更好的解决方案? 问题答案: 简单的解决方法是在子查询中添加一个子句: 一个更好的选择(就性能而言)是使用联接:

  • 问题内容: 让我们假设我必须将一个包含许多fk的表插入到表中,只是为了在 错误的语句 下面进行解释: 因此,基本上要插入的值来自不同的子查询,是否有可能实现这种行为? 问题答案:

  • 我需要根据一个子查询的结果更新一个表,该子查询带来了1个以上的值,但在下面的查询中,我得到错误返回“subquery returns mouth 1 row”。我想知道是否有可能做一个“循环”,以更新值与我下面的子查询中呈现的每个结果。 完成查询 返回2个或更多值的子查询。 结果 在理想的场景中,我的查询将执行第一个值,在第二个之后...第三个之后...而不重复前面的值。

  • 如何在给定节点下列出多个属性的所有属性和各自的值。 例如,在下面的代码中,我只能搜索一个属性。但我需要搜索10个不同的属性(alttext、img、promos等),并获得相应的值(如果存在)。

  • 我一直在理解Laravel查询生成器和纯SQL之间的融合。 我有2张桌子: user:包含具有主键的用户 User_Action:这是一个表,其中包含由和动作的组成的PRIMARYs记录。 ex: 使用者 用户操作 我的需要: 现在我想检索一个用户列表,其中包含每个用户的最新操作。因此,我只需要在从到的连接中获取一行,并且这一行必须是具有最新日期时间的一行。我的前任也是如此;我只想获取dateti

  • 问题内容: JOIN查询比几个查询快吗?(您运行主查询,然后根据主查询的结果运行许多其他的SELECT) 我问是因为加入它们会使我的应用程序设计复杂化 如果速度更快,谁能大致估算出多少?如果是1.5倍,我不在乎,但是如果是10倍,我想我是。 问题答案: 这太模糊了,无法为您提供与您的具体情况相关的答案。这取决于很多事情。Jeff Atwood(该网站的创始人)实际上撰写了有关此内容的文章。但是,在