【发布时间】:2015-06-08 20:10:15
【问题描述】:
我正在帮助重构的系统使用仪表板来帮助管理员工。在使用小样本进行开发期间,以下代码运行良好:
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 与 Entity Framework 一起使用以同时获取多个用户。这减轻了所有连接的痛苦,但它仍然为每个用户访问数据库。
如何转换此代码以同时获取所有用户?我过去使用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;
}
【问题讨论】:
标签: c# linq entity-framework entity-framework-6