Linq to Entities按变量列表获取实体列表

时间:2015-04-03 17:49:37

标签: c# linq entity-framework entity-framework-6

我帮助重构的系统使用仪表板来帮助管理员工。在使用小样本进行开发期间,以下代码运行良好:

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;
}

2 个答案:

答案 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;