C # 메서드에서 SQL을 제거하고 저장 프로 시저 및 Dapper 사용

asp.net c# dapper sql-server stored-procedures

문제

Dapper와 함께 저장 프로 시저를 사용하는 메서드를 변환하려고합니다. 그러나 나는 var result =... 가 계속 진행되는 것과 꽤 혼동을 var result =...

public Task<TUser> FindByIdAsync(Guid userId)
{
    var sql = @"SELECT *
                FROM IdentityUser
                WHERE UserId = @USERID";

    using (var connection = new SqlConnection(_connection))
    {
        var result = connection.Query<TUser, IdentityProfile, TUser>(sql, (user, profile) => { user.Profile = profile;
                             return user; }, 
                          new { userId }, splitOn: "UserId").SingleOrDefault();

        return Task.FromResult(result);
     }
}

여기에 내가 가진 것이있다.

public Task<TUser> FindByIdAsync(Guid userId)
{
    using (var connection = new SqlConnection(_connection))
    {
        var param = new DynamicParameters();
        param.Add("@UserId", userId);

        return Task.FromResult(connection.Query("IdentityGetUserById", param, commandType: CommandType.StoredProcedure).SingleOrDefault());
    }
}

인기 답변

그러나 나는 var result =가 계속 진행되는 것과 꽤 혼동을 느낍니다.

이것은 단순한 Dapper 기능과 혼동하지 않아도됩니다.

다음 코드가 무엇을하는지 설명하겠습니다.

var result = connection.Query<TUser, IdentityProfile, TUser>
                        (sql, (user, profile) => 
                        { 
                             user.Profile = profile;
                             return user; 
                        }, new { userId }, 
                       splitOn: "UserId").SingleOrDefault();
  1. 사용자는 프로필 유형의 일부인 복합 유형입니다.
  2. Sql 쿼리를 실행 한 결과는 UserId 열에서 자동으로 분할 된 결합 된 표 형식의 데이터 (사용자 및 프로필 모두에 대한 열 포함)이며 논리 user.Profile = profile 별로 User 형식으로 채워진 프로필 형식을 나타냅니다 user.Profile = profile
  3. 쿼리 결과가 IEnumerable<TUser> 이므로 Single record 가 반환되거나 null 반환하면 데이터를 반환하는 SingleOrDefault 가 호출됩니다.
  4. 이는 complex types 을 자동으로 바인드하는 표준 메커니즘입니다.

이제는 저장 프로 시저 인 IdentityGetUserById 를 실행할 때 동일한 종류의 코드가 필요합니다. 변경 사항은 저장 프로 시저 이름 (완료)으로 실제 SQL을 대체하고, 저장 프로 시저 (done)를 실행하고 있음을 Dapper에게 알려주고, 이미 DynamicParameter 익명 형식 일 수도 있습니다. 결과는 유사한 형식으로되어 있고 똑같은 바인딩을 할 수 있습니다. 다음 코드를 약간 수정하면됩니다.

using (var connection = new SqlConnection(_connection))
{
        var result = connection.Query<TUser, IdentityProfile, TUser>
        ("IdentityGetUserById", 
         commandType: CommandType.StoredProcedure,
         (user, profile) => 
                        { 
                           user.Profile = profile;
                           return user; 
                        }, new { userId }, 
                       splitOn: "UserId").SingleOrDefault();

          return Task.FromResult(result);
         );
}

사실, Dynamic Parameters 제거하고 Anonymous type 을 사용하여 SQL 코드와 일치하는지 확인했습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.