DataTable group by和迭代C#

时间:2015-08-18 15:06:55

标签: c# datatable

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

内容类似如下:

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和过滤来实现这一目标?

2 个答案:

答案 0 :(得分:4)

您可以使用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"));
    }
}

答案 1 :(得分:0)

您可以从数据表中获取唯一的用户列表(您也可以添加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)
    {
    ...
    }
}

一旦进入数据表,您每次都不会回到数据库。