Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中使用linq的数据表列和_C#_Asp.net_Linq - Fatal编程技术网

C# 在c中使用linq的数据表列和

C# 在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

这是我的第一个数据表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     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"))