C#コードに埋め込まれたカスタムSQLを使用せずに、Dapperで一般的な方法でマルチマッピングを使用する方法はありますか?カスタムSQLを使用しないDapperでのマルチマッピング
例 Correct use of Multimapping in Dapper
を参照してくださいには、共通のフィールドが参加するために自動的に決定されている2つの関連企業からのデータを照会するための一般的な方法はありますか?
C#コードに埋め込まれたカスタムSQLを使用せずに、Dapperで一般的な方法でマルチマッピングを使用する方法はありますか?カスタムSQLを使用しないDapperでのマルチマッピング
例 Correct use of Multimapping in Dapper
を参照してくださいには、共通のフィールドが参加するために自動的に決定されている2つの関連企業からのデータを照会するための一般的な方法はありますか?
これを行わないでください。このように考えることさえしないでください!データベースは長く持続し、正規化されています。オブジェクトは壊れやすいし、しばしば非正規化されています。そして、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を書きました:-)
Dapperを使用したマルチマッピングは、複数のSQLクエリを一度に実行し、特定のオブジェクトにマップされた各結果を返す方法です。
この質問の文脈では、マルチマッピングは関連していません。つまり、指定されたオブジェクトから自動的にSQLクエリを生成し、正しい結合を作成して単一のSQLクエリを生成する方法を求めています。マルチマッピングとは関係ありません。
あなたが探しているものは、Entity Frameworkのラインに沿ったものだと思っています。いくつかのSQLを生成するDapper拡張プロジェクトがいくつかあります。参照:Dapper.Rainbow VS Dapper.Contrib
制限はEFを使用しないことです! – Miha
@ミハ私はあなたがDapperにどれほど親しみがあるのかよく分かりませんが、DapperがSQLを生成しないという事実を乗り越える最も簡単な方法は、DapperがType Mapper以上のものであることを理解することです(ORMは、 SQLも生成します)。 Type Mapperでは、SQL結果のフィールドをTypeのプロパティにマップするだけです。 –
ORMとは対照的に、概念を明確にし、Dapperのタイプマッパーとしての限界を理解するのに役立つ、Metro Smurfに感謝します。私はDapperに慣れ親しむことを試みています。私のケースではその使用が必要なためです。 – Miha
熱心な読み込みを心がけてください。 QueryFirstで接続を管理できるようにすると、親結果セットがリストに変換され、結果セット全体がインスタンス化されます。 独自の接続を管理するので、一度に1行を処理して忘れたり、熱心な読み込みが1レベルだけ深刻になったり、結果セットが小さくなったり、ページが分けられたりすることがあります。 QueryFirstの考え方全体は、DB全体をメモリに取り込むべきではないということです。ちょうどそれを行うための鍵を与えました! – bbsimonbb