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;