2014-02-28 34 views
3

我必须在lambda表达式中转换给定的linq查询。即Group通过使用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

那么你有什么尝试,出了什么问题?按两列以上进行分组与按两列进行分组完全相同。为什么您需要将查询转换为查询表达式形式?如果您的查询作为查询表达式更具可读性,为什么不保持这种方式呢? –

+1

你真的要吗?如果你需要建立例如。动态地调用'where',你可以用扩展方法做到这一点,然后像平常一样通过LINQ关键字应用其余的转换。我假设你的问题是由匿名分组类型造成的。您也可以始终创建自己的类型来保存密钥。 – Luaan

回答

6

嗯,我不认为我应该做的一切你的工作你,但尤其是GROUP BY你问可以做这样的:

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

我尝试过,但它没有给出正确的结果 – user1078749

+0

你究竟是如何实现它的,请更新你的问题。 –

14

这是你的λ:

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();