Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 使用LINQ在datatable中的两列上按第三列的和分组_C#_Linq_Datatable - Fatal编程技术网

C# 使用LINQ在datatable中的两列上按第三列的和分组

C# 使用LINQ在datatable中的两列上按第三列的和分组,c#,linq,datatable,C#,Linq,Datatable,我正在搜索输入和输出数据表如下所示的LINQ查询- Name Code count ------------------------- User1 q1 2 user1 q2 2 user2 q2 1 user2 q3 3 user1 q1 2 Name Code Count ----------------------- User1 | q1 | 4 User1 | q2 | 2 User1 |

我正在搜索输入和输出数据表如下所示的LINQ查询-

Name    Code    count
-------------------------
User1   q1  2

user1   q2  2

user2   q2  1

user2   q3  3

user1   q1  2



Name    Code    Count
-----------------------
User1  |    q1   |  4
User1  |    q2   |  2
User1  |    q3   |  0
User2  |    q1   |  0
User2  |    q2   |  1
User2  |    q3   |  3

i、 e.我想要每个名称的不同代码集的计数之和,在结果表中,它显示(user1,q3,0),因为在输入数据表中没有user1的q3记录,请在这方面提供帮助,再次感谢

  var result =
            new DataTable().Rows.Cast<DataRow>()
                .Select(p => new {User = p[0], Q = p[1], Value = (double) p[2]})
                .GroupBy(p => new {p.User, p.Q})
                .Select(p => new {User = p.Key.User, Q = p.Key.Q, Total = p.Sum(x => x.Value)})
                .ToList();
var结果=
新建DataTable().Rows.Cast()
.Select(p=>new{User=p[0],Q=p[1],Value=(double)p[2]})
.GroupBy(p=>new{p.User,p.Q})
.Select(p=>new{User=p.Key.User,Q=p.Key.Q,Total=p.Sum(x=>x.Value)})
.ToList();
或者差不多,但你也可以做到:

   var result =
            new DataTable().Rows.Cast<DataRow>()
                .Select(p => new 
                          {
                              User = p.Field<string>("column1Name"), 
                              Q = p.Field<string>("column2Name"), 
                              Value = p.Field<double>("column3Name")
                          })
                .GroupBy(p => new {p.User, p.Q})
                .Select(p => new {User = p.Key.User, Q = p.Key.Q, Total = p.Sum(x => x.Value)})
                .ToList();
var结果=
新建DataTable().Rows.Cast()
.选择(p=>new
{
User=p.Field(“column1Name”),
Q=p.字段(“第2列名称”),
值=p.字段(“column3Name”)
})
.GroupBy(p=>new{p.User,p.Q})
.Select(p=>new{User=p.Key.User,Q=p.Key.Q,Total=p.Sum(x=>x.Value)})
.ToList();
这应该可以:

var query = table.AsEnumerable()
    .GroupBy(row => new { Name = row.Field<string>("Name"), Code = row.Field<string>("Code") });

var table2 = table.Clone(); // empty table with same schema
foreach (var x in query)
{
    string name = x.Key.Name;
    string code = x.Key.Code;
    int count = x.Sum(r => r.Field<int>("Count"));
    table2.Rows.Add(x.Key.Name, x.Key.Code, count);
}
但是,我不知道为什么结果表包含这一行:

User1  |    q3   |  0

原始表中没有名称代码组合User1+q3。

Hi tim,谢谢您的回复,但第一个代码在绑定到时抛出错误-“指定的强制转换无效”table2@user3240893:那么,
Count
列不是
int
列,而是(我猜)字符串列。更改为.User1 | q3 | 0;我想显示输入中所有不同代码的计数(可以是0)table@user3240893:请注意,我已编辑了我的第一种方法。我认为这要简单得多。根据您最后的评论,我稍后会查看。Count=codeGroup.Sum(r=>Convert.ToInt64(r[“code”]),我使用了它,现在它显示了结果,但不是根据需要。
User1  |    q3   |  0