LINQ:分组后,从实体的集合中选择最小值和最大值

时间:2018-08-10 15:47:58

标签: c# linq .net-core entity-framework-core

目标是从实体(外键)上的集合中获取第一个DateTime和Last DateTime。我的实体是组织,我的集合是发票。我将结果分组,因为不幸的是组织不是唯一的。我正在处理重复数据,不能假设我的组织是唯一的,所以我按实体上的数字字段分组。

我正在将.NET Core 2.1.2与实体框架一起使用。

我正在尝试从LINQ生成以下查询:

Entities

但是我不知道如何编写LINQ查询以使其生成此结果。

我得到了:

List

我不知道如何以这样的方式编写LINQ查询:

我还有几个问题:

  • Id,名称和数字的Min语句是否正确 分组中的第一个元素?
  • 我需要连接语句还是“ WHERE EXISTS”更好(这是在更改代码之前生成的)?

有人知道如何完成LINQ语句的编写吗?因为我必须从组织实体上的发票集合中获取第一个和最后一个日期:

Objects

1 个答案:

答案 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]