在使用 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 拆分为 'Foo' 类型时,它会将所有值作为动态传递给fooFunc
并因此对 'Bar' 执行相同的操作。传入的“动态”对象将代表拆分列(就像常规多映射可能具有重复的列名一样)。
我们怎样才能做到这一点?
背景
我们在一些遗留数据库上广泛使用 Dapper,但由于许多旧模式被迫使用动态输出将结果映射到对象(不同的列名、嵌套对象等)
现实情况是,尽管我们正在编写手动映射,但数据库(不在我们的控制范围内)和我们的对象之间的任何不一致都是在 Func 中完美而明确地定义的。一个包含 50 个表的数据库(我认为是中型的)只需要几个小时就可以绘制出来,并且只占任何开发时间的一小部分……完全值得。
这是好的部分。
我们正在努力解决的部分是,我们很难从我们的函数中获得良好的代码重用,即使它们在使用时表现完美。理想情况下,我们可以通过某种方式使用 Dapper 的多映射,但为每个类型分配一个 Func:
我研究了 ITypeMap 和 IMemberMap ,它们似乎是针对每个字段的自定义映射。我们真的在寻找基于每种类型的自定义映射(我们将处理分配)。
我很高兴自己尝试将其构建到 Dapper 中(并且在过去做出了如此微小的贡献),但希望得到一些指导。
谢谢!
更新
我目前正在尝试Query<dynamic,dynamic,Foo>
,但这并没有正确拆分。如果它确实拆分正确,这可能对我们有用。我们可以有效地将每个动态插入到我们的函数中并返回我们的强类型对象:
Query<dynamic,dynamic,Tuple<Foo,Bar>>((d1,d2)=>Tuple.Create(fooFunc(d1),barFunc(d2)));