Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ExpandoObject传递动态参数_C#_Sql_Dynamic_Parameter Passing_Expandoobject - Fatal编程技术网

C# 使用ExpandoObject传递动态参数

C# 使用ExpandoObject传递动态参数,c#,sql,dynamic,parameter-passing,expandoobject,C#,Sql,Dynamic,Parameter Passing,Expandoobject,我有一些函数的原型看起来像这样: 公共void doThings(字符串sql、动态dParams) 它使用这些参数执行某种SQL查询。我没有写,但我必须使用它。当我做这样的事情时,效果很好: doThings("select * from SomeTable where myval1=@v1 and myval2=@v2", new { v1 = new Dapper.DbString() {

我有一些函数的原型看起来像这样:
公共void doThings(字符串sql、动态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
块写入十次不同的场景,在这些场景中,我可能需要查询
myval2
myval3
等等。是否有某种特殊的方法可以传递
ExpandoObject
,或者通常应该采用的其他方法?

当您编写以下代码时,看起来
doThings
正在使用反射来获取所需的值:

new { 
    v1 = 1,
    v2 = "foo"
}
您正在使用两个属性创建类型
v1
v2
,但是 使用
ExpandoObject
不会向
ExpandoObject
添加任何新属性(其所有神奇行为都是由编译器生成的)

如果您想在编译时使用属性已知的
doThing
,我知道没有
问题当属性在运行时已知时,我可以考虑的唯一方法是在运行时使用
Reflection.Emit
生成所需的匿名类型。看看这篇文章。

Dapper默认情况下不支持Expandos,但您可以将expando传递给
字典的构造函数,然后将其作为动态参数传递

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

如果需要动态构建参数集, 根据这一点,您可以使用
DynamicParameters

因此,您可以从
dynparms
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));
它认为这可能是一个很好的功能