【问题标题】:Dapper for Table Valued parameter in generic implementation通用实现中表值参数的 Dapper
【发布时间】:2015-04-09 18:45:53
【问题描述】:

关注帖子 Using Dapper.TVP TableValueParameter with other parameters 我已经能够执行表值参数,但我的问题是关于它的部分实现。程序似乎正在运行,但我怎样才能使这个实现更通用?使用“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();
            }
        }

有什么建议我可以通过使参数名称更通用来解决这个问题吗?如果没有,每次我使用表值参数时都会专门实现

【问题讨论】:

  • 这里为什么需要使用AddDynamicParams.Add(parameter.Key, dt) 不起作用吗?'

标签: c# asp.net-mvc visual-studio dapper


【解决方案1】:

这对我来说并不明显任何都是必要的,因为:

  1. DynamicParameters 非常满意 TVP 作为直接元素,
  2. 所有显示的数据类型都会被自动处理
  3. dapper 愉快地使用字典
  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);
}

【讨论】:

  • Thanx @Marc,你说对了。实际上,我已经有一年左右没有更新我的 Dapper 库了,而且有点困在 TVP 上。我确实更新了它,它的神奇之处在于。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多