【问题标题】:Group By using more than two columns by Lambda expression通过 Lambda 表达式使用多于两列进行分组
【发布时间】:2014-04-01 02:33:59
【问题描述】:

我必须将给定的 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);

【问题讨论】:

  • 那么您尝试了什么,出了什么问题?按两列以上分组与按两列分组完全相同。为什么您需要将查询转换为查询表达式形式?如果您的查询作为查询表达式更具可读性,为什么不保持这种方式呢?
  • 你真的需要吗?如果您需要构建例如。 where 动态地,您可以使用扩展方法执行此操作,然后像往常一样通过 LINQ 关键字应用其余的转换。我假设您的问题是由匿名分组类型引起的。您也可以随时创建自己的类型来保存键。

标签: c# linq lambda


【解决方案1】:

这是你的 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();

【讨论】:

    【解决方案2】:

    好吧,我认为我不应该为您完成所有工作,但具体而言,您所询问的小组可以像这样完成:

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

    【讨论】:

    • 我试过这样,但它没有给出正确的结果
    • 您具体是如何实现的,请更新您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2021-01-04
    相关资源
    最近更新 更多