2012-06-21 88 views
0

下面我有表 - 由並從每個組只返回一個記錄最大ID公司將行分組並從每個組中獲取最大值。

id name value year 
    1 IBM 10 2011 
    2 IBM 30 2012 
    3 IBM 10 2012 
    4 C  10 2010 

我想組記錄。所有結果合併到2011年使用linq的公司列表中。對於我的示例輸出結果應該是 - 「3 IBM 10 2012」

我寫了一些內容,但無法正常工作。

var a = from x in companies where x.year > 2011 
        group x by new {x.name, x.value, x.ID, x.year } into g 
        select new { 
            g.Key.name, 
            g.Key.value, 
            g.Max(a=>a.ID), 
            g.Key.value 
           }; 
return a.ToList(); 
+1

你的意思是你希望它返回「3 IBM 10 2012」,是嗎? – WEFX

+0

你想按x.ID分組嗎? –

+0

是的,我的意思是返回「3 IBM 10 2012」 – user570715

回答

0

試試這個:

var a = from x in companies 
       where x.Year > 2011 
       group x by new { x.Name } into g 
       from x1 in companies 
       where x1.ID == (from x2 in g select x2.ID).Max() 
       select x1; 

或者一些更高效:

var a = from x in companies 
        where x.Year > 2011 
        group x by new { x.Name } into g 
        join x2 in companies on (from x3 in g select x3.ID).Max() equals x2.ID 
        select x2; 
+0

使用這個當我嘗試返回a.ToList();在函數結束時拋出錯誤Error 不能隱式地將類型'System.Collections.Generic.List '轉換爲'System.Collections.Generic.List ' – user570715

+0

好的。我會更新答案。 –

+0

@ user570715完成。 –

0

請勿在您的分組中包含該ID。事實上,如果你只是想通過他們的公司名稱分組,不包括任何其他屬性之一:

// set up for testing 
var companies = 
    from c in new[]{"1,IBM,10,2011", "2,IBM,30,2012", "3,IBM,10,2012", "4,C,10,2010"} 
    let cp = c.Split(',') 
    select new {id=int.Parse(cp[0]), name=cp[1], value=int.Parse(cp[2]), year=int.Parse(cp[3])}; 

// query 
var q = from x in companies where x.year > 2011 
     group x by x.name into g 
     let top = g.OrderByDescending(x => x.id).FirstOrDefault() 
     select new { 
         top.name, 
         top.value, 
         top.id, 
         top.year 
        }; 
+0

如果我不通過ID分組,我不能做g.Max(a => a.ID),但ID將無法訪問。 – user570715

+0

對不起,我試過這種方式,但它會拋出錯誤 - 錯誤無效的匿名類型成員聲明。匿名類型成員必須聲明爲成員分配,簡單名稱或成員訪問權限。 – user570715

+0

@ user570715:您的原始代碼存在各種其他問題。我剛剛發佈了一個絕對有效的更新。 (我在LINQPad中測試過) – StriplingWarrior