我正在使用包含子类对象的现有EF数据模型。这在处理单个对象时工作正常,但在加载大量对象进行分析时速度很慢。
我开始探索Dapper作为填充用于只读分析的POCO对象的替代方法。
麻烦的是,我看不出任何正确处理对象层次结构的方法。
如果我有
class MyBase
{
}
class MyDerived1 : MyBase
{
}
class MyDerived2 : MyBase
{
}
Dapper正确填充MyBase
var mine = conn.Query<MyBase>("SELECT * from MyTable");
Multimap功能似乎无法解决问题(或者我错过了什么?)。
有没有办法解决这个问题,没有为每个子类做一次数据库往返?
答案 0 :(得分:4)
public class MyBase
{
public String BaseProp { get; set; }
}
public class MyDerived1 : MyBase
{
public String Derived1Prop { get; set; }
}
public class MyDerived2 : MyBase
{
public String Derived2Prop { get; set; }
}
多重映射或动态映射应该可以解决问题。
MM:
String query = "SELECT * FROM Table";
var res = conn.Query<MyBase, MyDerived1, MyDerived2, Tuple<MyBase, MyDerived1, MyDerived2>>(query, (b, d1, d2) => Tuple.Create(b, d1, d2), splitOn: "Derived1Id,Derived2Id");
动态映射也非常酷,在您的情况下可能更灵活(感谢@Sam!)
var res = conn.Query<dynamic>(query).Select(x => new Tuple<MyBase, MyDerived1, MyDerived2>(new MyBase() { BaseProp = x.BaseProp },
new MyDerived1() { Derived1Prop = x.Derived1Prop },
new MyDerived2() { Derived2Prop = x.Derived2Prop }));