【问题标题】:Passing dynamic parameters with ExpandoObject使用 ExpandoObject 传递动态参数
【发布时间】:2013-09-30 00:40:01
【问题描述】:

我有一些原型看起来像这样的函数: 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() 并为我可能想要查询myval2myval3 等的十个不同场景写十次new 块。是否有一些特殊的方式我应该通过ExpandoObject,或者我应该以其他方式来做这个?

【问题讨论】:

    标签: c# sql dynamic parameter-passing expandoobject


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        如果您需要即时构建参数集, 根据这个article,可以使用DynamicParameters

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

        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));
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多