2016-11-14 12 views
1

C#コードに埋め込まれたカスタムSQLを使用せずに、Dapperで一般的な方法でマルチマッピングを使用する方法はありますか?カスタムSQLを使用しないDapperでのマルチマッピング

Correct use of Multimapping in Dapper

を参照してくださいには、共通のフィールドが参加するために自動的に決定されている2つの関連企業からのデータを照会するための一般的な方法はありますか?

答えて

1

これを行わないでください。このように考えることさえしないでください!データベースは長く持続し、正規化されています。オブジェクトは壊れやすいし、しばしば非正規化されています。そして、2つの間での移行は、あなたがSQLを書くときに注意深く行うことです。これは実際には自動化するステップではありません。長くて苦しい経験は、データベースの抽象化(テーブルや結合)がコードに吸い込まれる(またはコードから生成される)べきではないことを私たちの多くに確信させました。あなたがまだ確信していないなら、確立されたORMを使用してください。

一方、あなたはSQLをコントロールしたいが、C#の文字列リテラルに "埋め込み"をしてバグがあれば、それ以上は同意できない。クエリ用のC#ラッパーを生成するビジュアルスタジオ拡張であるQueryFirstを提案できますか。 SQLは実際のSQLファイルに保存され、検証された構文、DB参照がチェックされ、各保存時にQueryFirstはExecute()メソッドでラッパークラスを生成し、結果に対してPOCOを生成します。

マルチマッピングでは、ネストされたオブジェクトのグラフを塗りつぶすと仮定します。これを行う良い方法は、グラフのクラスごとに1つのQueryFirst .sqlを使用し、親クラスの部分クラスにListの子を追加することです。 (QueryFirstは、あなたがそれらのいずれかが、ツールが他の生成を制御POCOSは2つの部分クラスにまたがって分割されて生成される。)

ので、お客様のグラフとその注文の... を親SQLで

select * from customers where name like @custName 

子SQL積極的なロードの親部分クラスで

select * from orders where customerId = @customerId 

、...

public List<Orders> orders; 
    public void OnLoad() 
    { 
     orders = new getOrders().Execute(customerId); // property of the parent POCO 
    } 

または遅延読み込みのために...

private List<Orders> _orders; 
    public List<Orders> orders 
    { 
     get 
     {     
      return _orders ?? _orders = new GetOrders().Execute(customerId);     
     } 
    } 

5コードの行、ブラケットを数えていない、とあなたは、ネストされたグラフを持って、あなたが好むとしてロード遅延ロードされたか、熱心に、コード内で発見インターフェース(のためのインテリセンス入力パラメータと結果)。それらのテーブルには何百ものカラムがあり、その名前は決して再入力する必要はなく、そのデータ型はC#に透過的に流れます。

責任の明確な分離。トータルコントロール。免責事項:私はQueryFirstを書きました:-)

+0

熱心な読み込みを心がけてください。 QueryFirstで接続を管理できるようにすると、親結果セットがリストに変換され、結果セット全体がインスタンス化されます。 独自の接続を管理するので、一度に1行を処理して忘れたり、熱心な読み込みが1レベルだけ深刻になったり、結果セットが小さくなったり、ページが分けられたりすることがあります。 QueryFirstの考え方全体は、DB全体をメモリに取り込むべきではないということです。ちょうどそれを行うための鍵を与えました! – bbsimonbb

0

Dapperを使用したマルチマッピングは、複数のSQLクエリを一度に実行し、特定のオブジェクトにマップされた各結果を返す方法です。

この質問の文脈では、マルチマッピングは関連していません。つまり、指定されたオブジェクトから自動的にSQLクエリを生成し、正しい結合を作成して単一のSQLクエリを生成する方法を求めています。マルチマッピングとは関係ありません。

あなたが探しているものは、Entity Frameworkのラインに沿ったものだと思っています。いくつかのSQLを生成するDapper拡張プロジェクトがいくつかあります。参照:Dapper.Rainbow VS Dapper.Contrib

+0

制限はEFを使用しないことです! – Miha

+1

@ミハ私はあなたがDapperにどれほど親しみがあるのか​​よく分かりませんが、DapperがSQLを生成しないという事実を乗り越える最も簡単な方法は、DapperがType Mapper以上のものであることを理解することです(ORMは、 SQLも生成します)。 Type Mapperでは、SQL結果のフィールドをTypeのプロパティにマップするだけです。 –

+0

ORMとは対照的に、概念を明確にし、Dapperのタイプマッパーとしての限界を理解するのに役立つ、Metro Smurfに感謝します。私はDapperに慣れ親しむことを試みています。私のケースではその使用が必要なためです。 – Miha

関連する問題