如何在LINQ中的DataTable上使用group by?

时间:2018-04-08 10:26:14

标签: c# linq

我有DataTable列:

Column1, Column2, Column3, Column4

我需要选择:

sum Column1, Count Distinct (Column2), Column3, Column4

按Column3,Column4分组

我正在使用此代码但计数错误

的结果错误
var queryDGroup = dtsecscaleditemsCloned2.AsEnumerable()
    .GroupBy(r => new { Col1 = r["Column3"], Col2 = r["Column4"]});

foreach (var g in queryDGroup)
{
    DataRow addedRow = dtsecscaleditemsCloned.Rows.Add();
    addedRow["Column1"] = g.Distinct ().Count();
    addedRow["Column4"] = g.Key.Col2;
    addedRow["Column3"] = g.Key.Col1;
    addedRow["store_Code"] = "";
    addedRow["Column2"] = g.Sum(r => r.Field<int>("Column2"));
}

2 个答案:

答案 0 :(得分:2)

据我所知,您正在尝试计算Column2列中的不同值。在进行任何其他操作之前,您需要首先投影到该列。否则,您只是计算不同的DataRow个实例(这里没有意义)。

我这样写:

var query =
    from r in dt.AsEnumerable()
    group new
    {
        Column1 = r.Field<int>("Column1"),
        Column2 = r.Field<int>("Column2"),
    }
    by new
    {
        Column3 = r.Field<string>("Column3"),
        Column4 = r.Field<string>("Column4"),
    }
    into g
    select new
    {
        Column1 = g.Select(x => x.Column1).Distinct().Count(), // project first
        Column2 = g.Sum(x => x.Column2),
        g.Key.Column3,
        g.Key.Column4,
        StoreCode = "",
    };

答案 1 :(得分:0)

你可以试试这个:

var queryDGroup = dataTable.AsEnumerable()
    .GroupBy(c => new { Col3 = c["Column3"], Col4 = c["Column4"] },
             x => x,
            (k, g) => new
            {
                 Col1Sum = g.Sum(t => t.Field<int>("Column1")),
                 Col2Count = g.Select(t => t.Field<int>("Column2")).Distinct().Count()
            }).FirstOrDefault();

对象queryDGroup是一个匿名类型的对象,有两个属性:Col1SumCol1Count(名称不言自明)。

您可以创建强类型匿名对象,同时在执行group by时选择元素(GroupBy的第二个参数),或者在结果选择器部分中转换为单个列的数据类型({的最后一个参数{1}}),正如我在此处所示。