我帮助重构的系统使用仪表板来帮助管理员工。在使用小样本进行开发期间,以下代码运行良好:
public List<User> GetAllUsersByRoles(String role)
{
var userList = new List<User>();
string[] userNamesFromDB = Roles.GetUsersInRole(role);
foreach(string username in userNamesFromDB)
{
MembershipUser userFromDB = Membership.GetUser(username);
User user = ConvertUserFromDatabase(userFromDB);
user.Roles = Roles.GetRolesForUser(username);
userList.Add(user);
}
return userList;
}
正如您所看到的,这个迭代循环为每个用户多次访问数据库,并且不会缩放。
我希望将Linq与实体框架一起使用,同时抓住一些用户。这减轻了所有连接的痛苦,但它仍然为每个用户访问数据库。
如何将此代码转换为同时抓取所有用户?我过去曾使用SelectMany
成功解决了这个问题,但它似乎并没有在这里进行翻译。
public List<User> GetAllUsersByRoleForDashboard(String role)
{
List<User> userList = new List<User>();
string[] userNamesFromDB = Roles.GetUsersInRole(role);
var users = userNamesFromDB
.SelectMany(user => ctx.aspnet_Users
.Where(x => x.UserName == user)
.Select(user => new User
{
FirstName = ctx.Profile
.FirstOrDefault(x => x.ProfileID == ctx.User
.FirstOrDefault(u => u.UserID == user.UserId).ProfileID).FirstName,
LastName = ctx.Profile
.FirstOrDefault(x => x.ProfileID == ctx.User
.FirstOrDefault(u => u.UserID == user.UserId).ProfileID).LastName,
UserName = user,
IsApproved = ctx.aspnet_Membership
.FirstOrDefault(m => m.UserId == user.UserId).IsApproved,
})).ToList();
return users;
}
答案 0 :(得分:2)
public List<User> GetAllUsersByRoleForDashboard(String role)
{
var userNamesFromDB = new HashSet<string>(Roles.GetUsersInRole(role));
var users = context.aspnet_Users.Where(u => userNamesFromDB.Contains(u.UserName))
.Select(u=> new User
{
// Do your mapping
}).ToList();
return users;
}
在此类查询中使用HashSet的BTW可以提供更好的性能
答案 1 :(得分:1)
你可以这样做......如果我理解你的问题
from u in ctx.aspnet_Users
where usernames.Contains(u.UserName)
select u;