[asp.net-mvc]小巧玲珑的表值参数在泛型实现

发布时间: 2016/10/7 5:33:09
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

之后该职位与其他参数使用 Dapper.TVP TableValueParameter得以执行表值参数,但我的问题关于其实现的一部分。程序似乎工作,但如何使这种实现更更通用吗?在 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:

显然我不明白,任何的是必要的因为︰

  1. DynamicParameters作为直接的元素,是很开心的和许可证
  2. 所有显示的数据类型会自动处理
  3. 小巧玲珑的作品,愉快地与词典
  4. 小巧玲珑的已经打开和适当地关闭了连接,如果它没有打开时调用

看来唯一的有趣一步这里是 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);
}
赞助商