目标是从实体(外键)上的集合中获取第一个DateTime和Last DateTime。我的实体是组织,我的集合是发票。我将结果分组,因为不幸的是组织不是唯一的。我正在处理重复数据,不能假设我的组织是唯一的,所以我按实体上的数字字段分组。
我正在将.NET Core 2.1.2与实体框架一起使用。
我正在尝试从LINQ生成以下查询:
Entities
但是我不知道如何编写LINQ查询以使其生成此结果。
我得到了:
List
我不知道如何以这样的方式编写LINQ查询:
我还有几个问题:
有人知道如何完成LINQ语句的编写吗?因为我必须从组织实体上的发票集合中获取第一个和最后一个日期:
Objects
答案 0 :(得分:2)
这是诀窍。
要使用集合导航属性来简化inner join
,请使用SelectMany
并投影以后需要的所有原始属性(这对于当前的EF Core查询翻译器来说很重要) 。然后执行GroupBy
并投影关键属性/聚合。最后进行订购。
所以
var query = _context
.Organization
.SelectMany(organization => organization.Invoices, (organization, invoice) => new
{
organization.Id,
organization.Number,
organization.Name,
invoice.Date
})
.GroupBy(e => new
{
e.Number,
e.Name
})
.Select(g => new
{
Id = g.Min(e => e.Id),
Name = g.Key.Name,
Number = g.Key.Number,
First = g.Min(e => e.Date),
Last = g.Max(e => e.Date),
})
.OrderBy(e => e.Name);
被翻译为
SELECT MIN([organization].[Id]) AS [Id], [organization].[Name], [organization].[Number],
MIN([organization.Invoice].[Date]) AS [First], MAX([organization.Invoice].[Date]) AS [Last]
FROM [Organization] AS [organization]
INNER JOIN [Invoice] AS [organization.Invoice] ON [organization].[Id] = [organization.Invoice].[OrganizationId]
GROUP BY [organization].[Number], [organization].[Name]
ORDER BY [organization].[Name]