Dapper и подклассы

dapper

Вопрос

Я работаю с существующей моделью данных EF, которая включает объекты подкласса. Это отлично работает при работе с отдельными объектами, но довольно медленно при загрузке большого количества объектов для анализа.

Я начал изучать Dapper в качестве альтернативы для заполнения объектов POCO, используемых для анализа только для чтения.

Проблема в том, что я не вижу никаких средств для правильной обработки иерархии объектов.

Если бы у меня был

class MyBase
{
}

class MyDerived1 : MyBase
{
}

class MyDerived2 : MyBase
{
}

Dapper правильно заполняет список MyBase

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

Функция Multimap, похоже, не решает проблему (или я чего-то не хватает?).

Есть ли способ решить эту проблему, если не сделать одну поездку туда и обратно в базу данных для каждого подкласса?

Принятый ответ

 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; }
    }

Мультипликация или динамическое сопоставление должны делать трюк.

ММ:

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 }));


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow