如何从linq组中的数据表中选择多个列?

时间:2012-08-26 09:24:28

标签: c# linq

我有一个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的其他列?

2 个答案:

答案 0 :(得分: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 group)你可以使用同一个表的join。此代码显示了如何针对示例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"]
          };

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

答案 1 :(得分:1)

选择dtList中的多个列(column1,column2,colummn3):

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()
                          };