2

現在、多対多関連付け用の User、Roles、および User_Roles の 3 つのテーブルがあります。RoleID のリストを取得し、そのロールを持つユーザーを返す検索関数を作成したいと考えています。ただし、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();

Entity Framework で条件付き結合を行うことは可能ですか?

4

2 に答える 2

1

各ケースを個別に扱います。

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;
    }
}
于 2012-06-12T02:07:51.473 に答える
0

私の最大の懸念は、新しい検索条件が追加されたときにコードを維持し、データベース呼び出しを最小限に抑えることでした。最終的にifステートメントを使用しましたが、最後までデータベースからロードしませんでした。これにより、1 つの大きなクエリが送信されました。最後に呼び出して、データベース呼び出しを強制し.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();
    }
}
于 2012-06-14T00:00:46.920 に答える