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));
它认为这可能是一个很好的功能