2014-02-28 41 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();