Linq to Entities 通过变量列表获取实体列表
Linq to Entities Getting list of entities by list of variables
我正在帮助重构的一个系统使用仪表板来帮助管理员工。在使用小样本开发期间,以下代码运行良好:
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;
}
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 可以提供更好的性能
你可以那样做...如果我理解你的问题的话
from u in ctx.aspnet_Users
where usernames.Contains(u.UserName)
select u;
我正在帮助重构的一个系统使用仪表板来帮助管理员工。在使用小样本开发期间,以下代码运行良好:
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;
}
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 可以提供更好的性能
你可以那样做...如果我理解你的问题的话
from u in ctx.aspnet_Users
where usernames.Contains(u.UserName)
select u;