在实体框架/LINQ 查询中使用 MAX 聚合

问题描述 投票:0回答:1

我有一个项目,需要对 MSSQL 数据库使用 Entity Framework Core 7,但我一直坚持将 SQL 中的 MAX 聚合作为 LINQ 语句的一部分。

考虑以下数据:

Create Table #Member (
    MemberID int identity(1,1) primary key,
    FirstName VarChar(20)
)

Create Table #QuestLog (
    QuestID int identity(1,1) primary key,
    MemberID int,
    Quest VarChar(20),
    GoldCollected Int,
    MonstersDispatched Int
)

这是这些表的数据:

Insert #Member(FirstName) Values('Wealda')
Insert #Member(FirstName) Values('Tunbin')
Insert #Member(FirstName) Values('Ealhart')
Insert #Member(FirstName) Values('Rancent')

Insert #QuestLog(MemberID, Quest, GoldCollected, MonstersDispatched) Values(1, '1000 Doors', 100, 6)
Insert #QuestLog(MemberID, Quest, GoldCollected, MonstersDispatched) Values(1, '1000 Doors', 50, 100)
Insert #QuestLog(MemberID, Quest, GoldCollected, MonstersDispatched) Values(1, '1000 Doors', 75, 2)
Insert #QuestLog(MemberID, Quest, GoldCollected, MonstersDispatched) Values(1, 'Rats!', 555, 1500)
Insert #QuestLog(MemberID, Quest, GoldCollected, MonstersDispatched) Values(1, 'Kill Dr. Lucky', 50, 0)
Insert #QuestLog(MemberID, Quest, GoldCollected, MonstersDispatched) Values(1, 'Kill Dr. Lucky', 1000, 1)

这是为我带来我想要的数据的 SQL 查询。

Select M.FirstName, Q.Quest, Max(Q.GoldCollected) MaxGold
From #Member M
    Inner Join #QuestLog Q
        On M.MemberID = Q.MemberID
Group By M.FirstName, Q.Quest

这给了我这个数据集:

名字 任务 最大黄金
威尔达 1000 扇门 100
威尔达 杀死幸运博士 1000
威尔达 老鼠! 555

这是我迄今为止在 LINQ 查询中得到的内容。

var query = from m in dbContext.Member
                join q in dbContext.Quest on m.MemberID equals q.MemberID
            group new { m, q} by new { m.FirstName, q.Quest } into g 
            select new { FirstName = m.FirstName, Quest = q.Quest, MaxGold = ??? };

这就是我被困住的地方。如何将聚合 Max 转换为 LINQ 查询并获取结果?

c# linq entity-framework-core aggregate-functions ef-core-7.0
1个回答
0
投票

你很接近,这是一个简单的分组查询:

var query = 
    from m in dbContext.Member
    join q in dbContext.Quest on m.MemberID equals q.MemberID
    group q by new { m.FirstName, q.Quest } into g 
    select new 
    { 
        FirstName = g.Key.FirstName, 
        Quest = g.Key.Quest, 
        MaxGold = g.Max(x => x.GoldCollected) 
    };
© www.soinside.com 2019 - 2024. All rights reserved.