C# 在c中使用linq的数据表列和
这是我的第一个数据表dtC# 在c中使用linq的数据表列和,c#,asp.net,linq,C#,Asp.net,Linq,这是我的第一个数据表dt sscode scons cscons cstagged A 10 2 20 A 10 2 20 B 10 2 40 这是我的第二个数据表dt1 Unit sscode A101 A A101 A B101 B 我想要这个输出 Unit scons cscons cstagged A101
sscode scons cscons cstagged
A 10 2 20
A 10 2 20
B 10 2 40
这是我的第二个数据表dt1
Unit sscode
A101 A
A101 A
B101 B
我想要这个输出
Unit scons cscons cstagged
A101 20 4 40
执行此查询时出现错误。
这是我的密码
IEnumerable<DataRow> result = from data1 in dt.AsEnumerable()
join data2 in dt1.AsEnumerable()
on data1.Field<string>("sscode") equals
data2.Field<string>("substation_code")
group data2.Field<string>("Unit") by new {unit= data2.Field<string>("Unit")} into grp
orderby grp.Key.unit
select new
{
unit = grp.Key.unit,
sscons = grp.Sum(s => s.Field<string>("cscons")),
cscons = grp.Sum(s => s.Field<string>("cscons")),
cstagged = grp.Sum(s => s.Field<string>("cstagged"))
};
result.CopyToDataTable();
当前代码的问题是grp持有两个数据表的集合,在这种情况下,您将无法直接从第一个数据表获取项 如果我正确理解了您的问题,那么这将为您提供预期的输出:-
var result = from data2 in dt2.AsEnumerable()
group data2 by data2.Field<string>("Unit") into g
select new { Unit = g.Key, dt2Obj = g.FirstOrDefault() } into t3
let filteredData1 = dt.AsEnumerable()
.Where(x => x.Field<string>("sscode") == t3.dt2Obj.Field<string>("sscode"))
select new
{
unit = t3.unit,
sscons = filteredData1.Sum(s => s.Field<int>("cscons")),
cscons = filteredData1.Sum(s => s.Field<int>("cscons")),
cstagged = filteredData1.Sum(s => s.Field<int>("cstagged"))
};
首先,我们在第二个dataTable中按单元分组,因为这是我们需要的组,然后我们使用FirstOrDefault投影整个对象以获得sscode,然后根据从分组sscode获得的值简单地过滤第一个列表并投影项
选中。首先,您必须在group by之后选择,否则仅选择分组字段。 其次,不能对字符串求和。仅数值字段int,double 我对内联linq语法不太熟悉,所以我把它改成了方法链
var result =
dt.AsEnumerable()
.Join(dt1.AsEnumerable(), data1 => data1.Field<string>("sscode"), data2 => data2.Field<string>("substation_code"),
(data1, data2) => new {data1, data2})
.GroupBy(@t => new {unit = @t.data2.Field<string>("Unit")},
@t => @t.data1)
.Select(
grp =>
new
{
unit = grp.Key.unit,
sscons = grp.Sum(s => s.Field<int>("sscons")),
cscons = grp.Sum(s => s.Field<int>("cscons")),
cstagged = grp.Sum(s => s.Field<int>("cstagged"))
});
更新2
根据聊天记录,这些值似乎是十进制的,而不是整数:
sscons = grp.Sum(s => s.Field<decimal>("sscons")),
cscons = grp.Sum(s => s.Field<decimal>("cscons")),
cstagged = grp.Sum(s => s.Field<decimal>("cstagged"))
您可以共享错误消息吗?如果s=>s,则会出错。FieldCcons s不包含您正在计算字符串之和的定义?是的,但我不知道默认情况下在datatable中哪个数据类型是,因此datatable的默认数据类型是datatable。@Harshal-您不能直接将匿名类型投影到datatable。您必须实现或中提到的cusom类型。顺便说一句,你能告诉我为什么你需要一个数据表吗?SSCON和以下的总和不是performing@Harshal-没有像中那样执行?你有什么错误吗?我已经在我的系统上测试了它,它对我来说运行良好。@Harshal-我不知道你从哪里得到错误,请检查我刚才添加的小提琴,看看你哪里错了。Sums=>s.Fieldcstagged指定的强制转换无效。给定错误指定的强制转换对Sums=>s.FieldCcons无效。这些字段是什么类型的?如果它真的是字符串,那么必须解析为int。但最好首先将它们存储为int。将更新我的答案以添加一个转换为inti have ADED列的datatable are datatable data=new datatable;data.Columns.AddUnit,typeofstring;data.Columns.Addsscons,typeofint;data.Columns.Addcscons,typeofint;data.Columns.addcstaged,typeofint;而且它仍然给你指定的施法无效?@Harshal有些奇怪。单位与SSCON和CSCON不在同一个表中,但在上面的注释中,似乎您将ST字段添加到了同一个数据表中
sscons = grp.Sum(s => s.Field<decimal>("sscons")),
cscons = grp.Sum(s => s.Field<decimal>("cscons")),
cstagged = grp.Sum(s => s.Field<decimal>("cstagged"))