精致和子类

时间:2012-03-20 22:18:14

标签: dapper

我正在使用包含子类对象的现有EF数据模型。这在处理单个对象时工作正常,但在加载大量对象进行分析时速度很慢。

我开始探索Dapper作为填充用于只读分析的POCO对象的替代方法。

麻烦的是,我看不出任何正确处理对象层次结构的方法。

如果我有

class MyBase
{
}

class MyDerived1 : MyBase
{
}

class MyDerived2 : MyBase
{
}

Dapper正确填充MyBase

列表
var mine = conn.Query<MyBase>("SELECT * from MyTable");

Multimap功能似乎无法解决问题(或者我错过了什么?)。

有没有办法解决这个问题,没有为每个子类做一次数据库往返?

1 个答案:

答案 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");

enter image description here

动态映射也非常酷,在您的情况下可能更灵活(感谢@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 }));