3

我有一个 DataTable,我想用一列分组。

我为此使用此代码:

DataTable  dtList = list1.Items.GetDataTable();
         var grouped = from row in dtList.AsEnumerable()
                      group row by row["T"] into valueGroup
                      select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };

我的问题是:它是选择两列(id,value)。我想选择乘法列。

如何选择 dtlist 的其他列?

4

2 回答 2

2

如果要选择多个要分组的列,请尝试以下操作:

DataTable  dtList = list1.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
                      group row by new { T = row["T"], U = row["U"] } into valueGroup
                      select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };

这将为您提供作为匿名类型对象返回的多个列,这些对象TU属性可在Value返回集的字段中访问。

我已经对此进行了测试,它似乎适用于示例数据集。

它基于此处描述的解决方案:http: //social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/54f6ac70-e74c-4d9d-a9ee-6373714c0755

编辑

当使用group by子句时,所有项目都被分成组,每个组只返回一个项目,所以为了引用一个列,你必须把它放在group by子句中或者在它上面使用聚合方法(就像你对ID字段所做的那样和Max()方法)。

但是,如果要创建组,请获取ID每个组的最大值,然后检索这些项目的其他列(每个组中具有最大值ID),您可以将 ajoin用于同一个表。此代码显示了如何在您的示例TU列的情况下执行此操作。它似乎在测试数据集上正常工作:

var dtListEnumerable = dtList.AsEnumerable();
//group items and get max ID for each group
var groupedTemp = from row in dtListEnumerable
          group row by row["T"] into valueGroup
          select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };

//join to get the rest of columns for each item with max ID returned for each group
var grouped = from groupedItem in groupedTemp
          join row in dtListEnumerable on groupedItem.ID equals row["ID"]
              into tablesJoined
          from row in tablesJoined.DefaultIfEmpty()
          select new
          {
              ID = groupedItem.ID,
              T = row["T"], 
              U = row["U"]
          };

如果您需要任何帮助,请告诉我。如果它没有返回您要检索的数据,请提供有关它的更多详细信息。

于 2012-08-26T09:57:49.727 回答
1

选择 dtList 中的多列(column1、column2、column3):

DataTable  dtList = list1.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
                  group row by row["T"] into valueGroup
                  select new {
                         Value = valueGroup.Key,
                         ID = valueGroup.Max(id => id["ID"]),
                         col1 = row["column1"].ToString(),
                         col2 = row["column2"].ToString(),
                         col3 = row["column3"].ToString()
                          };
于 2012-08-26T09:47:01.833 回答