使用Lambda表达式按多于两列进行分组

3

我需要将给定的linq查询转换为lambda表达式,即:

var scholars = (from scholar in db.Scholars
                join suspension in db.Suspensions 
                    on scholar.ID equals suspension.ScholarID

                where suspension.StartDate >= startDate && 
                      suspension.EndDate <= endDate

                group scholar by new { scholar.ID, scholar.FirstName, scholar.LastName }
                    into g

                select new
                {
                    FullName = g.Key.FirstName +" " + g.Key.LastName,
                    TotalSuspensionSum = g.Sum(x => x.Suspensions.Sum(y => y.SuspensionDays))
                })
                .ToList()
                .OrderBy(x=> x.FullName);

2
你尝试过什么?出了什么问题?按超过两列分组与按两列分组完全相同。但你为什么需要将查询转换为查询表达式呢?如果你的查询作为查询表达式更易读,为什么不保持这种方式呢? - Jon Skeet
1
你真的需要吗?如果你需要动态构建例如 where,你可以使用扩展方法来实现,然后像往常一样通过 LINQ 关键字应用其余的转换。我猜你的问题是由于匿名分组类型引起的。你也可以随时创建自己的类型来保存键。 - Luaan
2个回答

17

这是您的Lambda函数:

var scholars = db.Scholars.Join(db.Suspensions,
        scholar => scholar.ID,
        suspension => suspension.ScholarID,
        (scholar, suspension) => new {scholar, suspension})
    .Where(u => u.suspension.StartDate >= startDate && 
                u.suspension.EndDate <= endDate)
    .GroupBy(u => new { u.scholar.ID, u.scholar.FirstName, u.scholar.LastName })
    .Select(u => new 
        {
            FullName = u.Key.FirstName + " " + u.Key.LastName,
            TotalSuspensionSum = u.Sum(x => 
                x.scholar.Suspensions.Sum(y => y.SuspensionDays)
            )
        })
    .OrderBy(x => x.FullName)
    .ToList();

7

我认为我不应该替你完成全部工作,但有关你所询问的group by可以这样实现:

...GroupBy(x => new { x.ID, x.FirstName, x.LastName })...

我尝试过这样做,但是它没有给出正确的结果。 - user1078749
请详细说明您是如何实现的,更新一下您的问题。 - Ashley Medway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接