【问题标题】:EF Core 2.0.2 generates multiple query for a subqueryEF Core 2.0.2 为一个子查询生成多个查询
【发布时间】:2018-04-15 22:16:52
【问题描述】:

我不确定这是否是错误,但我遇到了一些主要的性能问题。 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

更新 用 EF core 2.1.0-preview2-final 测试还是一样的问题

【问题讨论】:

  • 你为什么用db.TaskStatus而不是task.TaskStatus
  • 错误,改为 let LastStatus = task.TaskStatus.Where 结果相同
  • 是的,不,System.NotSupportedException: 'Could not parse expression 'task.TaskStatus.ToList()':
  • 抱歉完全错了……抱歉浪费了您的时间。
  • @IvanStoev FirstOrDefault 在 2.1.0-preview2-final 中解决了我的问题。所以我们升级了我们的项目。没有在 2.0.2 中测试(因为我们升级了它)。另请参阅最后对 git 的评论,了解“let”关键字的问题

标签: c# entity-framework-core


【解决方案1】:
  1. 升级到 EF 2.0.2 到 EF core 2.1.0-preview2-final
  2. 使用 FirstOrDefault() 而不是 First(),
  3. 不要使用“let”(“当使用 let 定义的子查询多次出现时存在已知问题”)见https://github.com/aspnet/EntityFrameworkCore/issues/11677 详情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2017-02-18
    • 2021-12-27
    • 2016-09-30
    相关资源
    最近更新 更多