2012-03-20 15 views
0

サブクラス化されたオブジェクトを含む既存のEFデータモデルで作業しています。個々のオブジェクトを扱うときはうまく動作しますが、分析のために多数のオブジェクトをロードするとかなり遅くなります。ダッパーとサブクラス

私は、リードオンリー解析に使用されるPOCOオブジェクトを設定する代わりに、Dapperを探索し始めました。

問題は、オブジェクト階層を正しく処理する手段がないことです。

私は

class MyBase 
{ 
} 

class MyDerived1 : MyBase 
{ 
} 

class MyDerived2 : MyBase 
{ 
} 

を持っている場合はDapperのは正しくMultimapは能力が問題を解決していないようです(または、私は何かが足りないのですか?)MyBase

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

のリストを移入します。

これを解決する方法はありますか?サブクラスごとにデータベースを1回往復するのは簡単ですか?

答えて

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

動的マッピングは、あなたのケースでも、非常にクールな、おそらくより柔軟である

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

その理由は、だろう、私は見ることができます(感謝@Sam!) MyBaseの1つのサブクラスのみをサポートしていますが、同じテーブルに複数のサブクラスがあります(デフォルトのEntity Frameworkストレージ)。私は確かに、各サブクラスごとに、その方法を確実に繰り返すことができます.Drriminator列にはWHERE句がありますが、N個のサブクラスのDBへのN回のラウンドトリップが発生します。 @EricJ。 –

+0

動的にマッピングして特定のエンティティに変換することができます。グリッド内で2つのクエリを実行することができます –

+0

動的マッピングは問題を解決するように見えます(実際には2つのクエリを実行したくありません)。ありがとう! –

関連する問題