繁体   English   中英

实体框架多对多条件联接

[英]Entity Framework many-to-many conditional join

现在,我有3个表:用于多对多关联的用户,角色和User_Roles。 我想创建一个包含RoleID列表并返回具有该角色的Users的搜索功能。 但是, 如果RoleID列表为空,则应返回所有Users

这是我到目前为止所拥有的..

public static List<User> SearchUser(List<int> roleIDs)
{
    List<User> userList = new List<User>();
    using (var db = new DBContext())
    {
        var users = (
            from u in db.Users
            join ur in db.User_Role
                on u.UserID equals ur.UserID
            join r in roleIDs
                on ur.RoleID equals r
            select u
            ).Distinct().ToList();
    }
    return userList;
}

但是我不知道只有在roleIDs不为空时有条件地加入User_Role的方法。

我也尝试过,但是没有用。

var users = (from u in db.Users
             from r in roleIDs
             join ur in db.User_Role
                 on u.UserID equals ur.UserID
             where roleIDs.Count == 0 || ur.RoleID == r
             select u
                ).Distinct().ToList();

实体框架中是否可以有条件加入?

分别处理每种情况。

public static List<User> SearchUser(List<int> roleIDs)
{
    using (var db = new DBContext())
    {
        if (roleIDs.Count == 0)
        {
             return db.Users.ToList();
        }

        var users = (
            from u in db.Users
            join ur in db.User_Role
                on u.UserID equals ur.UserID
            join r in roleIDs
                on ur.RoleID equals r
            select u
            ).Distinct().ToList();

        return users;
    }
}

如果联接表未映射为单独的实体,则可以按以下方式简化联接。

public static List<User> SearchUser(List<int> roleIDs)
{
    using (var db = new DBContext())
    {
        if (roleIDs.Count == 0)
        {
             return db.Users.ToList();
        }

        var users = db.Users.Where(u => u.Roles.Any(r => roleIDsContains(r.Id)))
            .Distinct().ToList();

        return users;
    }
}

我最大的担心是在添加新搜索条件时保持代码可维护性,并最大程度地减少数据库调用。 我最终使用了if语句,但是直到最后才从数据库中加载它。 这导致发送了一个大查询。 我通过在末尾调用.ToList()强制数据库调用。

public static List<user> SearchUser(List<int> roleIDs, List<int> hobbyIDs)
{
    List<User> Users = new List<User>();
    IQueryable<User> tempUsers = null;
    using (var db = new DBContent())
    {
        tempUsers = db.Users;

        if (roleIDs.Count > 0)
        {
            tempUsers = from u in tempUsers
                        join ur in db.User_Role on u.UserID equals ur.UserID
                        join r in roleIDs on ur.RoleID equals r
                        select u;
        }

        if (hobbyIDs.Count > 0)
        {
            tempUsers = from u in tempUsers
                        join uh in db.User_Hobby on u.UserID equals uh.UserID
                        join h in hobbyIDs on uh.HobbyID equals h
                        select u;
        }

        //Go get it from the database
        Users = ((ObjectQuery<User>)tempUsers)
            .Include("Address").Distinct().ToList();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM