我有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"));
}
答案 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
是一个匿名类型的对象,有两个属性:Col1Sum
和Col1Count
(名称不言自明)。
您可以创建强类型匿名对象,同时在执行group by时选择元素(GroupBy
的第二个参数),或者在结果选择器部分中转换为单个列的数据类型({的最后一个参数{1}}),正如我在此处所示。