如何 select 仅来自 GroupBy 的几列... First()

How to select only several columns from GroupBy... First()

我正在尝试 select 用户每年拥有的“最高”许可。

我开始于:

var lic = _context.Licences
            .Where(l => l.MemberNumber == memberNumber) 
            .GroupBy(l => new { l.LicenceYear }
            (key, g) => g.OrderByDescending(l => l.ProfessionalTitleId)
            .First());

而且有效。

但是它总是 returns 我不想要的许可证中的所有列。此外,我想 select 一些子 属性 喜欢 l.Title.TitleNumber,但无论我把 .Select(l => new {l.LicenceNumber, l.Title.TitleNumber}) 放在哪里生成 sql 查询 selects 所有列来自许可证,并且仅来自许可证。

我也试过了

var lic = _context.Licences
            .Where(l => l.MemberNumber == User.GetMemberNumber())            
            .GroupBy(l => new { l.LicenceYear },
            l => new { l.Title.TitleNumber, l.LicenceYear, l.LicenceNumber, l.Title.ProfessionalTitleId },
            (key, g) => g.OrderByDescending(l => l.ProfessionalTitleId)
            .First());

有趣的是,它使用 Title 中的 ProfessionalTitleId 正确地创建了 ROW_NUMBER(),但仍然 select 许可证中的所有列。

那么,如何将查询修改为 select 只有某些列?

此功能是 EF Core 6 的新功能,我看到了它的实现 - 它们只是克隆了解析上下文,可能还有所有字段。如果您在 GitHub.

中制造问题,他们可能稍后会改进投影

无论如何,有一个解决方法可以在不分组的情况下模拟相同的查询:

var filtered = _context.Licences.Where(l => l.MemberNumber == memberNumber);

var lic = 
    from d in filtered.Select(l => new { l.LicenceYear }).Distinct()
    from l in filtered.Where(l => l.LicenceYear == d.LicenceYear)
        .OrderByDescending(l => l.ProfessionalTitleId)
        .Take(1)
    select new 
    { 
        l.Title.TitleNumber, 
        l.LicenceYear, 
        l.LicenceNumber, 
        l.Title.ProfessionalTitleId 
    };