2012-12-18 33 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