7

我有一些函数的原型看起来像这样: public void doThings(string sql, dynamic dParams);

它使用这些参数进行某种 SQL 查询。我没有写,但我必须使用它。当我做这样的事情时它工作正常:

doThings("select * from SomeTable where myval1=@v1 and myval2=@v2",
        new
        {
            v1 = new Dapper.DbString()
            {
                Value = "yay",
                IsAnsi = true,
                Length = 50
            },
            v2 = new Dapper.DbString()
            {
                Value = "really",
                IsAnsi = true,
                Length = 32
            }
        });

但不是当我第一次将动态参数放入 ExpandoObject 时:

dynamic dynParams = new ExpandoObject();
dynParams.v1 = new Dapper.DbString()
    {
        Value = "yay",
        IsAnsi = true,
        Length = 50
    }
doThings("query here", dynParams);  

然后查询不返回任何结果。我不想在十个不同的场景中调用doThings()和写入该new块十次,在这些场景中我可能想要查询myval2ormyval3等​​等。是否有一些特殊的方式我应该通过ExpandoObject,或者我应该以其他方式来做这个?

4

3 回答 3

5

Dapper 默认不支持 Expando,但您可以将 expando 传递给 a 的构造函数,Dictionary<string,object>然后将其作为动态参数传递。

于 2013-11-18T15:22:24.330 回答
4

正如@Michael B 所提到的,Dapper 不支持将 Expandos 作为参数。

如果您需要动态构建参数集,根据这篇文章,您可以使用DynamicParameters.

dynParams因此,您可以从to构建一个翻译器DynamicParameters,它看起来像:

dynamic dynParams = new ExpandoObject();
dynParams.v1 = new Dapper.DbString()
{
    Value = "yay",
    IsAnsi = true,
    Length = 50
};

var parameters = new Dapper.DynamicParameters();

((ExpandoObject)dynParams).ToList().ForEach(kvp => parameters.Add(kvp.Key, kvp.Value));

它认为这可能是一个不错的功能。

于 2017-12-25T11:42:06.533 回答
1

当您编写时,它看起来像是doThings使用反射来获取所需的值:

new { 
    v1 = 1,
    v2 = "foo"
}

您正在创建具有两个属性的类型v1v2,但是当您使用时不会向其中添加任何新属性(它的所有神奇行为都是编译器生成的东西)。ExpandoObjectExpandoObject

如果您想使用doThing在编译时已知的属性,我知道没有问题。当属性在运行时已知时,我能想到的唯一方法是在运行时使用Reflection.Emit. 看看这篇文章。

于 2013-09-24T19:00:39.003 回答