如何 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
};
我正在尝试 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
};