DataTable分组并遍历C#

DataTable分组并遍历C#,c#,datatable,C#,Datatable,我有一个从数据库返回的数据表 内容如下: UserId | Address | Phone 1 blah 0123 1 blah2 3445 2 sdsdf 2343 2 ssf 2223 3 sadss 2321 这是从数据库返回的DataTable的内容 现在我只想按用户Id对结果进行分组,并循环输出结果 foreach(DataTableGroupedByUser中的Dat

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

内容如下:

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(Address和PhoneRows中的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和筛选来实现这一点?

您可以使用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"));
    }
}
var groupedByUserId=table.AsEnumerable().GroupBy(行=>row.Field(“UserId”);
foreach(groupedByUserId中的var组)
{
WriteLine(“用户Id:{0}”,group.Key);
控制台写入线(“地址电话”);
int rowNum=0;
foreach(组中的数据行)
{
Console.WriteLine(“{0}-{1}{2}”,++rowNum,row.Field(“地址”),row.Field(“地址”);
}
}

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

然后你可以做你的for循环

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

    foreach(var info in userInfo)
    {
    ...
    }
}

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

我在组中还有access UserId列吗?
foreach (int u in users)
{
    var userInfo = MyDatatable.Where(x => x.User_Id == u).ToList();

    foreach(var info in userInfo)
    {
    ...
    }
}