首页新闻找找看学习计划

关于Dapper.NET 自定义类型转换的问题。

0
悬赏园豆:100 [已解决问题] 解决于 2016-01-05 14:37

例如:

我数据库的某个字段储存的是json或xml格式的内容。

想在Query<T>的时候自动将该字段反序列化为一个实体。

Dapper.NET该怎么处理呢?

埋头前进的码农的主页 埋头前进的码农 | 初学一级 | 园豆:118
提问于:2015-12-24 13:28
< >
分享
最佳答案
0

哈哈,竟然有人有这个需求,说一下我是怎么做的吧。比如我有一个类

public class Person
{
    public string Name{get;set;}
    public School school{get;set;}
}

但是,我往数据库里面存的时候由于属性是强类型的,所以没办法存入,这个时候就想把它做成Json存入。这个时候我不是直接把School改为string,而是加了一个字段:

public class Person
{
    public string Name{get;set;}
    public School school{get;set;}
    public string schoolJson{get;set;}
}

我会把school序列化成json然后存入schoolJson中。但是,然后在做数据映射的时候,忽略Shool类型的school就可以了,但是,school要怎么办呢,在属性器里面写一下就可以了。

public class Person
{
    public string Name{get;set;}
    public School school{
        get{
            JsonConvert.DeserializeObject<School>(schoolJson);
        }
        set{
            schoolJson=JsonConvert.SerializeObject(value);
        }
    }
    public string schoolJson{get;set;}
}

平时你自己操作的时候直接使用School类型的数据就可以了,当dapper操作的时候,它取schoolJson和往schoolJson里面写数据。其实操作源和你是同一样,这就是为什么要用属性而不是变量的原因,只是现在大家都一抬手就{get;set;}而忽略了最初属性被创造出来的目的。

收获园豆:50
ensleep | 小虾三级 |园豆:1391 | 2015-12-24 15:15

没办法,最后采取的就是你这种方法。本来是想看看Dapper.NET 有没有自动类型转换的。

埋头前进的码农 | 园豆:118 (初学一级) | 2015-12-24 15:23

@埋头前进的码农: Dapper是轻量级的,不会把这些东西放进去的,它只负责把数据库的里面和我们实体之间进行搬运,具体的格式处理string转为clob和nvarchar已经是它所能容忍的极限了,毕竟它追求的性能。

ensleep | 园豆:1391 (小虾三级) | 2015-12-24 15:37

@ensleep: 那个说不支持的,直接方法Query中重载Func<>加载映射方法也可以的。

````` | 园豆:14268 (专家六级) | 2015-12-25 16:18

@`````: :good

ensleep | 园豆:1391 (小虾三级) | 2015-12-25 23:35
其他回答(4)
0

在映射对象中设置

private Xml _xml;

public XML xml{
set{this._xml = Xml.Parse(value);};
get{return this._xml;};
}

这样就可以直接操作了。代码写的不怎么对,大体上是那么个意思就是。

收获园豆:40
````` | 园豆:14268 (专家六级) | 2015-12-24 13:48

我的意思是说数据库储存的是XML格式,但是实体里面对应的是XML反序列化后的类。你这样实现的还是同一种类型。

支持(0) 反对(0) 埋头前进的码农 | 园豆:118 (初学一级) | 2015-12-24 13:55

@埋头前进的码农: 不是一种类型。

设置的时候设置对象,存储的时候数据库存储的json.或者xml格式的字符串,拿出来的还是对象。

自己设置下映射格式就足够解决了。

支持(0) 反对(0) ````` | 园豆:14268 (专家六级) | 2015-12-24 14:25

@`````: Dapper.NET 内部使用Emit赋值的,这个没办法手动映射。

支持(0) 反对(0) 埋头前进的码农 | 园豆:118 (初学一级) | 2015-12-24 14:26

@埋头前进的码农: 我知道。。

自己可是设置的。信我的。

随便写个例子吧。

 private String jsonColumn;


        public Dictionary<string, string> DictTest
        {
            get
            {

                return JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonColumn);
            }
            set
            {
                this.jsonColumn = JsonConvert.SerializeObject(value);
            }
        }

jsonColumn是数据库的列名称。其他的你自己设置,看看存储和映射了没有。

支持(0) 反对(0) ````` | 园豆:14268 (专家六级) | 2015-12-24 14:32

@`````: Dapper查询的时候能够把数据库的字段映射到私有字段吗?

支持(0) 反对(0) 埋头前进的码农 | 园豆:118 (初学一级) | 2015-12-26 16:24

@埋头前进的码农: 当然可以,不受限制。

支持(0) 反对(0) ````` | 园豆:14268 (专家六级) | 2015-12-27 21:26
0

可以改Dapper源码自己实现嘛:

自定义Attribute:

public class Person
{
    [AutoConvertJsonAttribute(typeof(School))]
    public School School {get; set;}

    [AutoConvertXmlAttribute(typeof(City))]
    public City City{get; set;}
}

然后再根据Attribute反序列化取到的数据

额,然后。。。没了。

 

额,我只是这么一说,还没动过手。貌似这么干了,Dapper就不是Dapper了。

姑且取名叫NBDapper吧。

收获园豆:10
liqipeng | 园豆:1160 (小虾三级) | 2015-12-25 21:29

这么干就得改写Dapper的源码了。

支持(0) 反对(0) 埋头前进的码农 | 园豆:118 (初学一级) | 2015-12-26 16:22
0

建议把值读出来后自己用jsonconvert转。

老牛在路上 | 园豆:11 (初学一级) | 2015-12-30 09:55
0
落叶落 | 园豆:202 (菜鸟二级) | 2019-11-27 16:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册