我的代码目前正常运行,但我想这样做,以便它不会多次调用数据库,但如果在User IDs
中输入了很多request
,则代价会很高。所以,我首先将list
users
连接到以逗号分隔的字符串中,我的DataAccess
图层方法允许这样,以便它可以返回list
users
} start
和end
时间。
我的数据如下:
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
我的问题是......我可以在foreach
循环之外移动DataAccess Layer调用,但是如何通过我的函数从返回的list
循环每个用户?目前,我正在为每个user
单独拨打电话。
我的代码:
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);
}
更新
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);
}
我开始遍历my方法返回的result
列表。问题是我没有按用户ID组织该列表以及它的所有开始和结束。我有它所以它有用户ID然后它的开始时间...用户ID然后它的结束时间。因此,如果我在xml中显示的数据被重复,那么用户在列表中的次数是多少次。
答案 0 :(得分:1)
我不认为我确实得到了你的问题,但我认为你可以使用GroupBy来枚举每个用户的收集。像
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);
}