当使用Dapper(Dapper-Dot-Net)的多图语义时,我们正在寻找以下功能:
SqlMapper.Configure.ForTypeUseFunc<T>(Func<dynamic,T> func);
//example usage
Func<object,Foo> fooFunc = (dynamic o) =>
new Foo{
Name = o.Name,
Status = (StatusTypes)o.StatusID
};
SqlMapper.Configure.ForTypeUseFunc<Foo>(fooFunc);
cnn.Query<Foo,Bar,Foo>...
因此,当Dapper将IDataReader拆分为&#39; Foo&#39;键入它将所有值作为动态传递给fooFunc
,因此对于&#39; Bar&#39;也会这样做。动态&#39;传入的对象将代表拆分列(就像常规多地图可能有重复的列名一样)。
我们如何实现这一目标?
背景
我们在一些遗留数据库上广泛使用Dapper,但由于许多旧模式被迫使用动态输出将结果映射到对象(不同的列名,嵌套对象等)。
现实情况是,虽然我们正在编写手动映射,但数据库(在我们控制范围之外)与我们的对象之间的任何不一致都在Func中完美而明确地定义。一个包含50个表格(我认为是中等大小)的数据库只需要几个小时的时间来绘制并代表任何开发的一小部分时间......完全值得。
这是很好的部分。
我们正在努力解决的问题是,即使在使用时行为完美,我们也很难从我们的功能中获得良好的代码重用。理想情况下,我们可以通过某种方式使用Dapper的多地图,但可以指定每种类型的Func:
我已经研究过ITypeMap和IMemberMap,它们似乎是针对每个字段的自定义映射。我们确实在寻找基于每种类型的自定义映射(我们将处理这些分配)。
我很乐意尝试将自己建立成Dapper(过去曾做过如此轻微的贡献),但我会喜欢一些指导。
谢谢!
更新
我目前正在尝试Query<dynamic,dynamic,Foo>
,但这并没有正确分裂。如果它正确分裂,这对我们有用。我们可以有效地将每个动态插入到我们的func中并返回我们的强类型对象:
Query<dynamic,dynamic,Tuple<Foo,Bar>>((d1,d2)=>Tuple.Create(fooFunc(d1),barFunc(d2)));
答案 0 :(得分:0)
Dapper足够偷偷摸摸,允许你拆分多个dynamic
类型。我们可以使用许多幕后实现来实现预期目标。下面是一个。
Query<dynamic,dynamic,Tuple<Foo,Bar>>((d1,d2)=>Tuple.Create(fooFunc(d1),barFunc(d2)));
那很好。在幕后,您可以将类型/功能存储在任何有意义的内容中(例如,词典。
我们现在要处理的问题是重复的列名称附加了数字(例如AddressID,AddressID1),使'SELECT *'语句不那么有用。