例如:
我数据库的某个字段储存的是json或xml格式的内容。
想在Query<T>的时候自动将该字段反序列化为一个实体。
Dapper.NET该怎么处理呢?
哈哈,竟然有人有这个需求,说一下我是怎么做的吧。比如我有一个类
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;}而忽略了最初属性被创造出来的目的。
没办法,最后采取的就是你这种方法。本来是想看看Dapper.NET 有没有自动类型转换的。
@埋头前进的码农: Dapper是轻量级的,不会把这些东西放进去的,它只负责把数据库的里面和我们实体之间进行搬运,具体的格式处理string转为clob和nvarchar已经是它所能容忍的极限了,毕竟它追求的性能。
@ensleep: 那个说不支持的,直接方法Query中重载Func<>加载映射方法也可以的。
@`````: :good
可以改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吧。
这么干就得改写Dapper的源码了。
建议把值读出来后自己用jsonconvert转。