C# 衣冠楚楚

C# 衣冠楚楚,c#,dapper,C#,Dapper,我正在使用现有的EF数据模型,其中包括子类对象。这在处理单个对象时效果很好,但在加载大量对象进行分析时速度非常慢 我开始探索作为填充用于只读分析的POCO对象的替代方法 问题是,我看不到任何正确处理对象层次结构的方法 如果我有 class MyBase { } class MyDerived1 : MyBase { } class MyDerived2 : MyBase { } Dapper正确填充MyBase var mine = conn.Query<MyBase>("SE

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

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

问题是,我看不到任何正确处理对象层次结构的方法

如果我有

class MyBase
{
}

class MyDerived1 : MyBase
{
}

class MyDerived2 : MyBase
{
}
Dapper正确填充
MyBase

var mine = conn.Query<MyBase>("SELECT * from MyTable");
var mine=conn.Query(“从MyTable中选择*);
多重映射功能似乎无法解决问题(或者我遗漏了什么?)

有没有办法解决这个问题,除了为每个子类往返一次数据库之外

 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=“从表中选择*”;
var res=conn.Query(Query,(b,d1,d2)=>Tuple.Create(b,d1,d2),splitOn:“Derived1Id,Derived2Id”);

动态映射也很酷,在您的情况下可能更灵活(谢谢@Sam!)

var res=conn.Query(Query)。选择(x=>newtuple(new MyBase(){BaseProp=x.BaseProp},
新的MyDerived1(){Derived1Prop=x.Derived1Prop},
新的MyDerived2(){Derived2Prop=x.Derived2Prop});
多重映射或动态映射应该可以做到这一点

嗯:

String query=“从表中选择*”;
var res=conn.Query(Query,(b,d1,d2)=>Tuple.Create(b,d1,d2),splitOn:“Derived1Id,Derived2Id”);

动态映射也很酷,在您的情况下可能更灵活(谢谢@Sam!)

var res=conn.Query(Query)。选择(x=>newtuple(new MyBase(){BaseProp=x.BaseProp},
新的MyDerived1(){Derived1Prop=x.Derived1Prop},
新的MyDerived2(){Derived2Prop=x.Derived2Prop});

我明白为什么只有MyBase的一个子类会有帮助,但我在同一个表中有多个子类(默认实体框架存储)。我当然可以对每个子类重复一次这种方法,在描述符列中使用WHERE子句,但这会导致N个子类的N次往返到DB。@EricJ。您可以始终将其映射到动态,然后转换到特定实体。。。或者在网格中运行两个查询动态映射看起来可以解决问题(我真的不想运行两个查询)。谢谢我明白为什么只有MyBase的一个子类会有帮助,但我在同一个表中有多个子类(默认实体框架存储)。我当然可以对每个子类重复一次这种方法,在描述符列中使用WHERE子句,但这会导致N个子类的N次往返到DB。@EricJ。您可以始终将其映射到动态,然后转换到特定实体。。。或者在网格中运行两个查询动态映射看起来可以解决问题(我真的不想运行两个查询)。谢谢
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");
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 }));