【发布时间】:2020-06-14 22:17:52
【问题描述】:
我目前正在尝试将现有 SQL Server 查询转换为 EF Core。目标是获取所有用户并获取他们最新的订单日期时间和最新的支持请求日期时间。我想确保即使用户还没有订单或支持请求,他们也会被退回。如果他们没有下订单,“最新订单日期-时间”一栏应为 NULL。如果他们没有提交支持请求,“最新支持请求日期-时间”列应为 NULL。
输出的列应该是:Id、Name、Email、LatestOrderDateTime、LatestSupportRequestDateTime
这是我的工作 SQL 服务器查询:
SELECT [User].[Id], [User].[Name], [User].[Email], MAX([Order].[DateTime]) as LatestOrderDateTime, MAX([SupportRequest].[DateTime]) as LatestSupportRequestDateTime FROM [User]
LEFT JOIN [Order] on [User].[Id] = [Order].[UserId]
LEFT JOIN [SupportRequest] on [User].[Id] = [SupportRequest].[ConsumerId]
GROUP BY [User].[Id], [User].[Name], [User].[Email]
ORDER BY [User].[Id]
这是我尝试过的,但它没有在服务器上评估:
await this.context.User
.GroupBy(u => new { u.Id, u.Name, u.Email })
.Select(g => new
{
id = g.Key.Id,
name = g.Key.Name,
email = g.Key.Email,
lastOrderDateTime = g.Max(o => o.Orders.Select(o => o.DateTime)),
lastSupportRequestDateTime = g.Max(o => o.SupportRequests.Select(s => s.DateTime)),
})
.OrderBy(c => c.id)
.ToListAsync();
我只想将此查询转换为 EF 核心(查询不会在本地进行评估)。
如果你可以在方法语法中做到这一点,那就太好了,但如果没有,我可以用 JetBrains Rider 转换它。
非常感谢您的帮助!
【问题讨论】:
-
仅供参考,它是查询语法,而不是 lambda 语法。 Lambda 用于查询语法和方法语法,因此名称有点混乱。
-
“我目前正在尝试将现有的 SQL 服务器查询转换为 EF Core”——您的帖子并没有以任何方式显示这一点。到目前为止,您尝试过什么? ;)
-
好点@TomTom,已修复!
-
如果我正确地遵循了您的问题,则不会,但 ToListAsync 是在本地评估您的查询的方法。如果您删除该 ToListAsync,则不会在本地对其进行评估。
-
不对。 ToListAsync 触发评估,但这并不意味着它在本地执行它。如果 context.User 是 ef(core) 那么此时它将生成并发送 sql。
标签: c# sql-server linq entity-framework-core