首页 新闻 会员 周边

关于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 | 小虾三级 |园豆:1682 | 2015-12-24 15:15

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

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

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

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

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

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

@`````: :good

ensleep | 园豆:1682 (小虾三级) | 2015-12-25 23:35
其他回答(4)
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
0
拼博之路 | 园豆:202 (菜鸟二级) | 2020-03-28 09:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册