我有一个项目,需要对 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 查询并获取结果?
你很接近,这是一个简单的分组查询:
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)
};