>

역할 목록이있는 사용자와 다 대다 관계를 매핑하려고합니다

이 질문 Dapper Many-to-Many Query 로 시도했지만 각각 하나의 역할을 가진 여러 사용자를 제공했습니다.

대신 QueryMultiple 문을 사용하려고합니다. 내 문제는 전자 메일에서 사용자를 쿼리하지만 사용자 ID에서 역할을 쿼리해야한다는 것입니다. 따라서 첫 번째 쿼리 문의 결과에 액세스하여 ID를 두 번째 쿼리에 전달해야합니다. 어떻게해야합니까?

       public async Task<User> GetUserByEmailAsync(string email, CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested();
        using (var connection = new SqlConnection(_options.ConnectionString))
        {
            await connection.OpenAsync(cancellationToken);
            var results = await connection.QueryMultipleAsync(@"SELECT * FROM [User] WHERE Email = @email; " +
            "SELECT Id, Name, NormalizedName FROM [Role] JOIN [UserRole] ON [Role].Id = UserRole.RoleId" +
            " WHERE [UserRole].UserId = 2",  // <-- NEED TO INSERT USER ID DYNAMICALLY HERE
            new
            {
                email
            });
            var user = await results.ReadSingleAsync<User>();
            var roles = await results.ReadAsync<Role>();
            foreach (var role in roles)
            {
                user.Roles.Add(role);
            }
            return user;
        }
    }


  • 답변 # 1

    현재 완전히 테스트 할 수는 없지만이 방법을 사용하여 특정 사용자에 대한 모든 역할을 채우면 결과적으로 단일 사용자를 얻을 수 있습니다

    public async Task<User> UserFromEmail(string email)
    {
        Dictionary<int, User> result = new Dictionary<int, User>();
        string query = @"
                SELECT u.*, r.*
                FROM [User] u JOIN [UserRole] ur on u.UserId = ur.UserId
                              JOIN [Roles] r on ur.RoleId = r.Id
                WHERE u.Email = @email;";
        using (IDbConnection cnn = OpenConnection())
        {
            var users = await cnn.QueryAsync<User, Role, User>(query, (u, r) =>
            {
                // this lambda is called for each record retrieved by Dapper
                // receiving a user and a role created by Dapper from the record
                // and it is expected to return a user.
                // We look if the user passed in is already in the dictionary 
                // and add the role received to the roles list of that user
                if (!result.ContainsKey(u.UserId))
                    result.Add(u.UserId, u);
                User working = result[u.UserId];
                working.roles.Add(r);
                return u;
            }, new { email }, splitOn: "RoleId");
            // Return the first element in the dictionary
            if (result.Values.Count > 0)
                return result.Values.First();
            else
                return null;
        }
    }
    
    

관련 자료

  • 이전 arrays - 어떻게하면 PHP에서 문자열을 쓸 수 있고 오류가 발생하지 않습니다
  • 다음 luajit - 다음 루아 코드가 왜 유효합니까?