C# 循环遍历方法返回的列表中的每个用户

C# 循环遍历方法返回的列表中的每个用户,c#,list,loops,for-loop,foreach,C#,List,Loops,For Loop,Foreach,我的代码目前可以工作,但我希望它不会多次调用数据库,但如果在请求中输入了许多用户ID,那么它可能会变得昂贵。因此,我首先将用户的列表连接成一个由逗号分隔的字符串,这是我的数据访问层方法允许的,这样它就可以返回用户的列表及其开始和结束时间 我的数据如下所示: UserId Time EventType Test1 xx-xx-xxxx Start Test1 xx-xx-xxxx End Test1 xx-xx-xxxx Start Test1 xx-x

我的代码目前可以工作,但我希望它不会多次调用数据库,但如果在
请求中输入了许多
用户ID
,那么它可能会变得昂贵。因此,我首先将
用户
列表
连接成一个由逗号分隔的字符串,这是我的
数据访问
层方法允许的,这样它就可以返回
用户
列表
及其
开始
结束
时间

我的数据如下所示:

UserId     Time     EventType
Test1   xx-xx-xxxx   Start
Test1   xx-xx-xxxx   End
Test1   xx-xx-xxxx   Start
Test1   xx-xx-xxxx   End
Test2   xx-xx-xxxx   Start
Test2   xx-xx-xxxx   End
我的问题是。。。我可以将DataAccess层调用移到
foreach
循环之外,但是如何通过函数从返回的
列表中循环每个用户?目前,我正在为每个
用户
单独打电话

我的代码:

var userList = string.Join(",", Array.ConvertAll(request.Users, x => x.ToString()));
response.UserRecordList = new List<UserRecord>();

foreach (String userId in request.Users) // request.Users is a Array of UserId's 
{
    List<UserModel> result = // I am making my DataAccess Layer call here.
    UserRecord record = new UserRecord();
    record.UserId = userId;
    record.TimePeriodList = new List<TimePeriod>();
    for (int i = 0; i < result.Count; i += 2)
    {
        TimePeriod timeData = new TimePeriod();
        timeData.StartTime = result[i].TimeDate;
        timeData.EndTime = result[i + 1].TimeDate;
        record.TimePeriodList.Add(timeData);
        }
        response.UserRecordList.Add(record);
}
var userList=string.Join(“,”,Array.ConvertAll(request.Users,x=>x.ToString());
response.UserRecordList=新列表();
foreach(request.Users中的字符串userId)//request.Users是userId的数组
{
List result=//我正在这里进行数据访问层调用。
UserRecord=新的UserRecord();
record.UserId=UserId;
record.TimePeriodList=新列表();
对于(int i=0;i
更新:

response.UserRecordList = new List<UserRecord>();
var userList = string.Join(",", Array.ConvertAll(request.Users, x => x.ToString()));
List<UserModel> result = // EDIT - I am making my DataAccess Layer call here.

foreach (var resultList in result) // EDIT - iterate through the returned list
{
    UserRecord record = new UserRecord();
    record.UserId = userId;
    record.TimePeriodList = new List<TimePeriod>();
    for (int i = 0; i < result.Count; i += 2)
    {
        TimePeriod timeData = new TimePeriod();
        timeData.StartTime = result[i].TimeDate;
        timeData.EndTime = result[i + 1].TimeDate;
        record.TimePeriodList.Add(timeData);
        }
        response.UserRecordList.Add(record);
}
response.UserRecordList=newlist();
var userList=string.Join(“,”,Array.ConvertAll(request.Users,x=>x.ToString());
List result=//编辑-我正在这里进行数据访问层调用。
foreach(result中的var resultList)//编辑-遍历返回的列表
{
UserRecord=新的UserRecord();
record.UserId=UserId;
record.TimePeriodList=新列表();
对于(int i=0;i

我开始遍历方法返回的
结果
列表。问题是我没有按照用户Id和它的开始和结束来组织列表。我有它,所以它有用户Id,然后它的开始时间。。。用户Id,然后是结束时间。因此,如果我在xml中显示的数据被重复了多少次,那么用户在列表中的次数将是多少。

我不认为我完全理解您的问题,但我认为您可以使用它来枚举每个用户的集合。像

var userList = string.Join(",", Array.ConvertAll(request.Users, x => x.ToString()));
List<UserModel> result = // move it outside foreach and pass userList to make database call.

foreach (var resultList in result.GroupBy(x => x.UserId))
{
    var perUserResults = resultList.ToList();
    UserRecord record = new UserRecord();
    record.UserId = resultList.Key; //key is the user id field since we have grouped on UserId
    record.TimePeriodList = new List<TimePeriod>();
    for (int i = 0; i < perUserResults.Count; i += 2)
    {
        TimePeriod timeData = new TimePeriod();
        timeData.StartTime = perUserResults[i].TimeDate;
        timeData.EndTime = perUserResults[i + 1].TimeDate;
        record.TimePeriodList.Add(timeData);
    }

    response.UserRecordList.Add(record);
}
var userList=string.Join(“,”,Array.ConvertAll(request.Users,x=>x.ToString());
List result=//将其移到foreach外部并传递userList以进行数据库调用。
foreach(result.GroupBy(x=>x.UserId)中的var resultList)
{
var peruser results=resultList.ToList();
UserRecord=新的UserRecord();
record.UserId=resultList.Key;//Key是用户id字段,因为我们已经根据UserId分组
record.TimePeriodList=新列表();
对于(int i=0;i
使用“in”子句一次性将用户ID传递给DB?像
从(1,2,3)中的用户ID所在的表中选择*
?我不能更改数据库调用。我必须自己组织Web服务中的数据@nawfal@user4756836内部循环与foreach循环一样。你想要什么东西还不太清楚。可能正在编辑您的问题有帮助。@user4756836查看我的更新。如果我接近你想要的,我希望这个想法对你来说是清楚的。@nawfal,这很有效!很好的解释!谢谢@user4756836这里的关键是内部循环。
GroupBy
返回按特定键分组的内部序列(其中
.Key
本身是内部序列上的属性)。因此,您只需枚举内部序列(在上面的代码中是
ToList()
部分)来获取组中的项目,然后调用
.Key
来获取分组参数本身。理解LINQ使事情变得相当容易。