C# 实体框架多对多条件联接

C# 实体框架多对多条件联接,c#,entity-framework,C#,Entity Framework,现在我有3个表:多对多关联的User、Roles和User\u角色。我想创建一个搜索函数,它接收RoleID列表并返回具有该角色的用户。但是如果RoleID列表为空,它应该返回所有用户 这就是我到目前为止所拥有的 public static List<User> SearchUser(List<int> roleIDs) { List<User> userList = new List<User>(); using (var db

现在我有3个表:多对多关联的User、Roles和User\u角色。我想创建一个搜索函数,它接收RoleID列表并返回具有该角色的用户。但是如果RoleID列表为空,它应该返回所有用户

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

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

是否可以在实体框架中使用条件联接?

分别处理每种情况

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;
    }
}
publicstaticlist-SearchUser(List-roleIDs)
{
使用(var db=new DBContext())
{
if(roleIDs.Count==0)
{
返回db.Users.ToList();
}
变量用户=(
从u到db.Users
在db.User\u角色中加入ur
在u.UserID上等于ur.UserID
加入roleIDs中的r
关于ur.RoleID等于r
选择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 = db.Users.Where(u => u.Roles.Any(r => roleIDsContains(r.Id)))
            .Distinct().ToList();

        return users;
    }
}
publicstaticlist-SearchUser(List-roleIDs)
{
使用(var db=new DBContext())
{
if(roleIDs.Count==0)
{
返回db.Users.ToList();
}
var users=db.users.Where(u=>u.Roles.Any(r=>roleIDsContains(r.Id)))
.Distinct().ToList();
返回用户;
}
}

我最关心的是在添加新的搜索条件时保持代码的可维护性,并尽量减少数据库调用。我最终使用了if语句,但直到最后才从数据库中加载它。这导致了一个大型sent查询。最后,我通过调用
.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();
    }
}
publicstaticlist-SearchUser(List-roleIDs,List-hobbyIDs)
{
列表用户=新列表();
IQueryable tempUsers=null;
使用(var db=new DBContent())
{
tempUsers=db.Users;
如果(roleIDs.Count>0)
{
tempUsers=来自tempUsers中的u
在u.UserID上的db.User_角色中加入ur等于ur.UserID
将r加入到ur上的roleIDs中。RoleID等于r
选择u;
}
如果(hobbyIDs.Count>0)
{
tempUsers=来自tempUsers中的u
加入db.User\u Hobby on u.UserID等于uh.UserID
在HobbyID上加入h,HobbyID等于h
选择u;
}
//从数据库中获取它
用户=((ObjectQuery)临时用户)
.包括(“地址”).Distinct().ToList();
}
}

谢谢你。我曾想过使用if语句,但实际上,该函数将能够使用多个列表参数来进一步过滤搜索。对于空列表和非空列表的所有组合,使用if语句会很快变得一团糟。这就是为什么我认为条件连接是最优雅的方式。我将您的回答标记为答案,因为从技术上讲,if语句是最好的方式。我只是改变了逻辑。请参阅我发布的回复。
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();
    }
}