2012-12-18 31 views
2

我有8個字段的DataTable。我想返回另一個將前7個字段分組並且最大值爲8的DataTable。所有字段都是字符串,第8個是存儲在字符串字段中的數字,例如, 「24」。我到目前爲止已經試過LINQ /通過多種標準的DataTable組和獲得最大的

代碼:

public DataTable highestVersion(DataTable dt) 
     { 
      DataTable dtResult=dt.Clone(); 

      var query=from dtRow in dt.AsEnumerable() 
         group dtRow by new 
         { 
          b_r = dtRow["r"], 
          b_1 = dtRow["b_1"], 
          b_2 = dtRow["b_2"], 
          p_r = dtRow["p_r"], 
          p_1 = dtRow["p_1"], 
          p_2 = dtRow["p_2"], 
          p_f = dtRow["p_f"] 
         } 
          into maxVersion 
          select maxVersion.OrderByDescending(a => a["p_v"]).First(); 

      foreach (var result in query) 
      { 
       dtResult.ImportRow(result); 
      } 
      return dtResult; 
     } 

我的期望是,group dtRow by new{}應該由第一組7,並通過調用OrderByDescending().First()每個分組只能得到最高的元素p_v。但這似乎並沒有做任何事情;所有的輸入行都被返回。

編輯:我剛剛意識到的問題是什麼。 p_f中的值彼此不同,例如,

datarow 1 
-------- 
r: "abc" 
b_1: "def" 
b_2: "ghi" 
p_r: "jkl" 
p_1: "mno" 
p_2: "pqr" 
p_f: "stu_this" 
p_v: "18" 

datarow 2 
-------- 
r: "abc" 
b_1: "def" 
b_2: "ghi" 
p_r: "jkl" 
p_1: "mno" 
p_2: "pqr" 
p_f: "stu_that" 
p_v: "24" 

在這種情況下,我會想只返回的DataRow 2,因爲24> 18,並能夠獲取stu_that值。

+0

爲了澄清,您只需要r,b_1,b_2,p_r,p_1,p_2和p_f的最大值,並且想要使用它作爲排序來排序行? –

+0

sigil,你爲什麼認爲它不起作用?它確實! – horgh

回答

4

更新了響應答案評論:

var res = dt.AsEnumerable() 
      .GroupBy(dtRow => new 
      { 
       b_r = dtRow["r"], 
       b_1 = dtRow["b_1"], 
       b_2 = dtRow["b_2"], 
       p_r = dtRow["p_r"], 
       p_1 = dtRow["p_1"], 
       p_2 = dtRow["p_2"] 
      }) 
      .Select(g => new 
      { 
       Group = g, 
       Max = g.Max(r => r["p_v"]) 
      }) 
      .Select(g => new 
      { 
       Key = g.Group.Key, 
       Max = g.Max, 
       Values = g.Group 
          .Where(r => r["p_v"].Equals(g.Max)) 
          .Select(r => r["p_f"]) 
      }); 

我想這可以優化到一定程度,但至少這應該做的工作,如果所有的條件,目前已知的,當然。

+0

我原來的帖子中沒有包含足夠的信息。我在編輯中添加了必要的信息。 – sigil

+0

@sigil是不是應該被除了'p_f'以外的所有字段分組? – horgh

+0

我仍然堅持你的代碼完成這項工作......只是從'group by'子句中刪除'p_f'。 – horgh