【问题标题】:DataTable group by and iterate through C#DataTable 分组并遍历 C#
【发布时间】:2015-08-18 15:06:55
【问题描述】:

我有一个从数据库返回的数据表。

内容类似如下:

UserId | Address | Phone
 1        blah     0123
 1        blah2    3445
 2        sdsdf    2343
 2        ssf      2223
 3        sadss    2321

这是从数据库返回的DataTable的内容。

现在我只想按用户 ID 对结果进行分组并循环输出结果

foreach(DataTableGroupedByUser 中的 DataRow userRow){

foreach(AddressAndPhoneRows 中的 DataRow restOfColumns){

输出用户详细信息 } }

我会得到的输出应该是:

User Id: 1

Address   Phone
1- blah   0123
2- blah2  3445

User Id 2:
  Address   Phone
1- sdsdf    2343
2- ssf      2223

用户 ID:3 ...

希望你能明白。

基本上我不想为每个用户多次查询数据库,而只是使用一个查询来提取所有数据并处理内存中的分组。

还有其他原因。

有没有办法通过使用DataTable和过滤来实现这一点?

【问题讨论】:

    标签: c# datatable


    【解决方案1】:

    您可以使用 LINQ:

    var groupedByUserId = table.AsEnumerable().GroupBy(row => row.Field<int>("UserId"));
    
    foreach(var group in groupedByUserId)
    {
        Console.WriteLine("User Id: {0}", group.Key);
        Console.WriteLine("Address   Phone");
        int rowNum = 0;
        foreach(DataRow row in group)
        {
            Console.WriteLine("{0}- {1}   {2}", ++rowNum, row.Field<string>("Address"), row.Field<string>("Address"));
        }
    }
    

    【讨论】:

    • 我还可以访问组中的 UserId 列吗?
    【解决方案2】:

    您可以从数据表中获取唯一的用户列表(您也可以添加 order by 子句)

    var users = MyDatatable.Select(x => x.User_ID).Distinct().ToList();
    

    然后你可以做你的 for 循环

    foreach (int u in users)
    {
        var userInfo = MyDatatable.Where(x => x.User_Id == u).ToList();
    
        foreach(var info in userInfo)
        {
        ...
        }
    }
    

    一旦它在数据表中,您将不会每次都返回数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多