일반 구현에서의 테이블 값 매개 변수에 대한 Dapper

asp.net-mvc c# dapper visual-studio

문제

게시물에 따라 Dapper.TVP TableValueParameter를 다른 매개 변수와 함께 사용하여 테이블 값 매개 변수를 실행할 수 있었지만 제 질문은 구현의 일부에 관한 것입니다. 프로 시저가 작동하는 것 같지만 어떻게이 구현을 좀 더 일반적인 것으로 만들 수 있습니까? 'new {}'가있는 DynamicParameters에 매개 변수를 추가하는 것은 요구 사항에 따라 매우 특수화 된 구현입니다. 내 매개 변수 이름도 지정할 수 있어야합니다. 예를 들어

public IEnumerable<TCustomEntity> SqlQuery<TCustomEntity>(string query, IDictionary<string, object> parameters,
            CommandType commandType) where TCustomEntity : class
        {
            DataTable dt;
            DynamicParameters dp;
            var sqlConnection = _context.Database.Connection;
            try
            {

                if (sqlConnection.State == ConnectionState.Closed)
                {
                    sqlConnection.Open();
                }


                var dynamicParameters = new DynamicParameters();
                if (parameters != null)
                    foreach (var parameter in parameters)
                    {

                        if (parameter.Value is int)
                            dynamicParameters.Add(parameter.Key, parameter.Value, DbType.Int32);
                        else if (parameter.Value is string)
                            dynamicParameters.Add(parameter.Key, parameter.Value.ToString(), DbType.String);
                        else if (parameter.Value is DateTime)
                            dynamicParameters.Add(parameter.Key, parameter.Value, DbType.DateTime);
                        else if (parameter.Value is Decimal)
                            dynamicParameters.Add(parameter.Key, parameter.Value, DbType.Decimal);
                         else if (parameter.Value is DataTable)
                         {
                             dt = (DataTable)parameter.Value;
                             dt.SetTypeName(dt.TableName);
                             var parameterName = parameter.Key;

                             dp = new DynamicParameters(new { TVPName = dt });
                             // Here i want TVPName replaced with parameterName/parameter.Key but it doesn't seem possible
                             dynamicParameters.AddDynamicParams(dp);



                         }
                        else
                         dynamicParameters.Add(parameter.Key,  parameter.Value);
                    }
                var test = sqlConnection.Query<TCustomEntity>(query, dynamicParameters, commandType: commandType);
                return test;
            }
            finally
            {
                sqlConnection.Close();
            }
        }

매개 변수 이름을 좀 더 일반화하여 문제를 해결하려면 어떻게해야합니까? 그렇지 않으면 테이블 값 매개 변수를 사용할 때마다 특수화 된 구현이됩니다.

수락 된 답변

하나가 필요하다는 것은 나에게 분명하지 않다.

  1. DynamicParameters 는 TVP를 직접 요소로 완벽하게 만족합니다.
  2. 표시된 모든 데이터 유형이 자동으로 처리됩니다.
  3. 대퍼는 사전과 함께 행복하게 일합니다.
  4. dapper는 이미 호출 될 때 열려 있지 않으면 연결을 적절하게 열고 닫았습니다.

여기서 유일하게 흥미로운 단계는 SetTypeName 이며 다음과 같이 할 수 있습니다.

foreach(object val in parameters.Values)
{
    if(val is DataTable) {
        var dt = (DataTable)val;
        dt.SetTypeName(dt.TableName);
    }
}

그런 다음 원래 parameters 객체를 전달합니다.

return sqlConnection.Query<TCustomEntity>(query, parameters, commandType: commandType);

그것은 단지 나뭇잎 :

public IEnumerable<TCustomEntity> SqlQuery<TCustomEntity>(string query,
    IDictionary<string, object> parameters, // suggestion: default to null
    CommandType commandType // suggestion: default to CommandType.Text
) where TCustomEntity : class
{
    var sqlConnection = _context.Database.Connection;

    if (parameters != null) {
        foreach (object val in parameters.Values) {
            if (val is DataTable) {
                var dt = (DataTable)val;
                // suggestion: might want to only do if dt.GetTypeName() is null/""
                dt.SetTypeName(dt.TableName);
            }
        }
    }

    return sqlConnection.Query<TCustomEntity>(query, parameters,
        commandType: commandType);
}


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