簡體   English   中英

LINQ:在分組后從實體的集合中選擇最小值和最大值

[英]LINQ: Select the Min and Max values from a collection on an entity after grouping

目標是從實體(外鍵)上的集合中獲取第一個DateTime和Last DateTime。 我的實體是一個組織,我的收藏是發票。 我正在對結果進行分組,因為很遺憾,組織並不是唯一的。 我正在處理重復數據,並且不能假設我的組織是唯一的,所以我在我的實體上按數字字段進行分組。

我正在使用.NET Core 2.1.2和Entity Framework。

我正在嘗試從LINQ生成以下查詢:

SELECT MIN([organization].[Id]) AS Id, MIN([organization].[Name]) AS Name, 
MIN([organization].[Number]) AS Number, MIN([invoice].[Date]) 
AS First, MAX([invoice].[Date]) AS Last
FROM [organization]
INNER JOIN [invoice] ON [invoice].[OrganizationId] = [organization].[Id]
GROUP BY [organization].[Number], [organization].[Name]
ORDER BY [organization].[Name]

但是我不知道如何編寫LINQ查詢以使其生成此結果。

我得到了:

await _context
            .Organization
            .Where(z => z.Invoices.Any())
            .GroupBy(organization => new
            {
                organization.Number,
                organization.Name
            })
            .Select(grouping => new
            {
                Id = grouping.Min(organization => organization.Id),
                Name = grouping.Min(organization => organization.Name),
                Number= grouping.Min(organization => organization.Number),
                //First = ?,
                //Last = ?
            })
            .OrderBy(z => z.Name)
            .ToListAsync();

我不知道如何編寫LINQ查詢,以便生成上述內容。

我還有幾個問題:

  • Id,Name和Number的Min語句是否正確獲取分組中第一個元素的方法?
  • 我是否需要連接語句或“更好地存在”(這是在我更改代碼之前生成的)?

有誰知道如何完成LINQ語句的編寫? 因為我必須從我的組織實體的發票集合中獲取第一個和最后一個日期:

organization.Invoices.Min(invoice => invoice.Date)
organization.Invoices.Max(invoice => invoice.Date)

這是訣竅。

要使用集合導航屬性進行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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM