【问题标题】:Linq to Entities Getting list of entities by list of variablesLinq to Entities 通过变量列表获取实体列表
【发布时间】: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


    【解决方案1】:
    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 会给您带来更好的性能

    【讨论】:

    • 为什么要更改 HashSet?我刚刚尝试了以前的代码,它工作得很好。
    • 呵呵我只是在写原因:) 实际上,如果您有很多项目,您会注意到性能。我所说的“很多”是指 700
    • 您能解释一下使用 HashSet 时的性能提升吗?内存中的集合只是转换为 sql 参数,那么为什么哈希集的性能会比数组好呢?数据不会循环多次。
    【解决方案2】:

    你可以那样做......如果我理解你的问题

    from u in ctx.aspnet_Users where usernames.Contains(u.UserName) select u;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多