C# 使用Dapper绑定具有附加动态属性的强类型模型

C# 使用Dapper绑定具有附加动态属性的强类型模型,c#,dynamic,dapper,strong-typing,C#,Dynamic,Dapper,Strong Typing,我们希望能够使用它为我们的业务模型提供对象关系映射 与这些数据模型一起,我们经常遇到由用户创建的自定义字段(在运行时未知),这些字段显示为返回结果集的一部分: Id Title c_MyCustomField1 c_MyCustomField2 目前,所有这些字段都由读取器返回和处理。我们想把这一切都转移到,但很难解决如何将强类型对象与动态自定义字段混合在一起的问题 我们的选择如下: class Model { int Id {get; set;} string Title {

我们希望能够使用它为我们的业务模型提供对象关系映射

与这些数据模型一起,我们经常遇到由用户创建的自定义字段(在运行时未知),这些字段显示为返回结果集的一部分:

Id
Title
c_MyCustomField1
c_MyCustomField2
目前,所有这些字段都由读取器返回和处理。我们想把这一切都转移到,但很难解决如何将强类型对象与动态自定义字段混合在一起的问题

我们的选择如下:

class Model
{
    int Id {get; set;}
    string Title {get; set;}
    IList<CustomField> CustomFields {get; set;}
}

class CustomField : dynamic
{
    string Name {get; set;}
    object Value {get; set;}
}
  • 以动态方式从dapper获得每个结果,并进行我们自己的绑定
  • 让Dapper绑定到强类型模型,并单独调用以附加自定义字段
  • 扩展DAPPER以进入中间添加我们的特定用户实例来绑定已知字段和动态字段。
  • 1似乎适得其反,我们可能会受到性能的打击,这就是为什么您首先要介绍Dapper2我们真的不能这样做,因为这需要对数据提供商进行大规模更改3我知道我不属于整洁的源头

    我认为圣杯会以这样一个模型结束:

    class Model
    {
        int Id {get; set;}
        string Title {get; set;}
        IList<CustomField> CustomFields {get; set;}
    }
    
    class CustomField : dynamic
    {
        string Name {get; set;}
        object Value {get; set;}
    }
    
    类模型
    {
    int Id{get;set;}
    字符串标题{get;set;}
    IList自定义字段{get;set;}
    }
    类CustomField:动态
    {
    字符串名称{get;set;}
    对象值{get;set;}
    }
    
    有没有什么方法可以用Dapper来完成


    一如既往,我们非常感谢您的任何建议。

    这些建议目前还不能以整洁的方式进行建模;您可以使用非泛型API执行某些操作,然后手动应用绑定。或者只包装一个动态:

    class Model {
        private dynamic obj;
        public int Id { get { return obj.Id; } set { obj.Id = value; } }
        public string Title { get { return obj.Title; } set { obj.Title = value; } }
    
        public object this[string key] {
            get { return ((IDictionary<string,object>)obj)[key]; }
            set { ((IDictionary<string,object>)obj)[key] = value; }
        }
    }
    
    类模型{
    私有动态对象;
    公共int Id{get{return obj.Id;}set{obj.Id=value;}
    公共字符串Title{get{return obj.Title;}set{obj.Title=value;}}
    公共对象此[字符串键]{
    获取{return((IDictionary)obj)[key];}
    set{((IDictionary)obj)[key]=value;}
    }
    }
    

    使用
    Query
    可以获得
    dynamic
    /
    IDictionary
    ,而无需指定泛型参数。

    有趣的是,“clean”是一个在讨论这个问题时经常出现的形容词。你的建议肯定让人觉得,如果我们决定迈出这一步,这应该是我们前进的方向。感谢您的时间。我们现在有没有更好的方法在最新版本的Dapper中绑定?@CoderAbsolute当前没有,现在没有,我的整个应用程序都在Dapper上。很抱歉抓住这个线程,但我想将我的模型(强类型)转换为dapper和SimpleCRUD接受的匿名类型。你有更干净的方法吗?@CoderAbsolute-dapper如果你把你的模型传给它,它会尽力挑选要发送的成员,等等