首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dapper DynamicParameters对象可以像参数字典一样被枚举吗?

Dapper DynamicParameters对象可以像参数字典一样被枚举吗?
EN

Stack Overflow用户
提问于 2015-09-24 00:20:37
回答 2查看 12.9K关注 0票数 11

我知道我可以在ParameterDirection中使用Dapper.DynamicParameters:

代码语言:javascript
复制
var parameters = new DynamicParameters();
parameters.Add("iparam", 42);
parameters.Add("oparam", null, DbType.Int32, ParameterDirection.Output);
connection.Execute(sql, parameters);

但是当我使用Dictionary<string, object>时,我可以这样做吗?

代码语言:javascript
复制
var parameters = new Dictionary<string, object>();
parameters.Add("iparam", 42);
parameters.Add("oparam", /* ??? */ );
connection.Execute(sql, parameters);

或者,如何在DynamicParameters上迭代以获得参数名称和值?

原文标题:

使用字典可以添加带有ParameterDirection的Dapper参数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-25 03:19:57

这似乎是Dapper的一个bug。这在最新的NuGet包中得到确认:

代码语言:javascript
复制
foreach (var paramName in parameters.ParameterNames)
{
    var value = ((SqlMapper.IParameterLookup)parameters)[paramName];
}

然而,它有点冗长。在本地使用脱衣舞源代码(不是NuGet包)时,我能够运行这段代码而没有出错(在编写提交b77e53时):

代码语言:javascript
复制
foreach (var paramName in parameters.ParameterNames)
{
    var value = parameters.Get<dynamic>(paramName);
}

根据查尔斯·伯恩斯的评论的说法,它仍然会抛出一个异常,这让我相信这个补丁还没有进入NuGet。修复Get<dynamic>的提交是这里

票数 10
EN

Stack Overflow用户

发布于 2017-09-20 10:17:42

每次追加DynamicParameters对象时,都可以包含几个节。因此,不像上面的答案那样迭代ParameterNames (它将是空的)。

代码语言:javascript
复制
public static Dictionary<string, object> ToParametersDictionary(this DynamicParameters dynamicParams)
{
    var argsDictionary = new Dictionary<String, Object>();
    var iLookup = (SqlMapper.IParameterLookup) dynamicParams;
    //if (dynamicParams.ParameterNames.Any())
    //{
        // read the parameters added via dynamicParams.Add("NAME", value)
        foreach (var paramName in dynamicParams.ParameterNames)
        {
            var value = iLookup[paramName];
            argsDictionary.Add(paramName, value);
        }
    //}
    //else
    //{
        // read the "templates" field containing dynamic parameters section added
        // via dynamicParams.Add(new {PARAM_1 = value1, PARAM_2 = value2});
        var templates = dynamicParams.GetType().GetField("templates", BindingFlags.NonPublic | BindingFlags.Instance);
        if (templates != null)
        {
            var list = templates.GetValue(dynamicParams) as List<Object>;
            if (list != null)
            {
                // add properties of each dynamic parameters section
                foreach (var objProps in list.Select(obj => obj.GetPropertyValuePairs().ToList()))
                {
                    objProps.ForEach(p => argsDictionary.Add(p.Key, p.Value));
                }
            }
        }
    }
    return argsDictionary;
}

GetPropertyValuePairs(..)

代码语言:javascript
复制
public static Dictionary<string, object> GetPropertyValuePairs(this object obj, String[] hidden = null)
{
    var type = obj.GetType();
    var pairs = hidden == null
        ? type.GetProperties()
            .DistinctBy(propertyInfo => propertyInfo.Name)
            .ToDictionary(
                propertyInfo => propertyInfo.Name,
                propertyInfo => propertyInfo.GetValue(obj, null))
        : type.GetProperties()
            .Where(it => !hidden.Contains(it.Name))
            .DistinctBy(propertyInfo => propertyInfo.Name)
            .ToDictionary(
                propertyInfo => propertyInfo.Name,
                propertyInfo => propertyInfo.GetValue(obj, null));
    return pairs;
}

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    var seenKeys = new HashSet<TKey>();
    return source.Where(element => seenKeys.Add(keySelector(element)));
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32751477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档