25

仕事で mvc3 プロジェクトに dapper を使用していますが、気に入っています。しかし、dapper を使用する場合、アプリケーションをどのように階層化することになっているのでしょうか。現在、私はすべてのSQLをコントローラーに直接詰め込んでいます(slap)が、静的文字列でクラスを作成することを考えていました..だから私はできる

var reports = Dapper.Query<Report>(conn, MySql.ReportsRunningQuery)

dapperを使用するときにSQLをどのように保存しますか?

4

3 に答える 3

31

同等の LINQ クエリを配置する場所に sql を配置するか、 DataContext.ExecuteQuery の sql を配置します。それがどこにあるかについては...まあ、それはあなた次第であり、どれだけ離れたいかによって異なります.

Query<T>ただし、個人的には、呼び出しから離れた別のクラスに SQL を隠す利点はないと思います。データ (および実際にはパラメーター) を簡単に検証できるように、それらをコンテキストで表示する必要があります。また、その場で (まだパラメーター化された) クエリを作成している場合もあります。しかし、通常の静的クエリの場合、抽象化する必要がある正当な理由がない限り、TSQL をコードの近くのリテラルとして保持します。

var reports = conn.Query<Report>(@"
select x.blah, y.blah
from x (snip)
where x.ParentId = @parentId and y.Region = @region", new {parentId, region});

(上記の代替拡張メソッドの使用法にも注意してください)

IMO、上記の重要な点は、他の場所からそのクエリを再利用する可能性は非常に低いということです-代わりにロジックがメソッドに入れられ、そのメソッドが複数の場所から呼び出されます。したがって、クエリを中央のラッパーの背後に隠すために使用できる他の唯一の理由は、(異なる SQL ダイアレクトを使用して) 異なるデータベース プロバイダーをサポートする必要がある場合です。そして、それは人々が理解するよりもまれです。

于 2011-05-13T06:48:29.023 に答える
12

リソース ファイルの使用は、私たちにとって非常に便利です。/Sql という名前のフォルダーに .sql ファイルを作成し、それらを SqlResource オブジェクトの「Files」セクションにドラッグします。リソース ファイルの 'Strings' セクションは、非常にクリーンで、SQL の小さなスニペット (たとえば、クエリを実行する関数) を簡単に処理できます。

したがって、SQL は次のようになります。

var reports = conn.Query<Report>(SqlResource.Blahs_get, new {parentId, region});

これにより、リポジトリが本当にきれいに保たれます。また、すべての SQL をリソース ファイルに格納することには、エントリを反復処理し、潜在的に PARSEONLY を使用して db をクエリして、db オブジェクトが変更された場合にクエリが壊れることを確認できるという点で、追加の利点があります (これはほとんどの場合ではありませんが、そうではないことに注意してください)。 100% 信頼できます)。

したがって、結論として、私たちにとってリソースファイルは物事を本当にきれいに保ちますが、Marc Gravell の指摘によれば、それらは本番コード内で再利用するためのものではありません...各 SQL ステートメントは、アプリケーション内の 1 つのポイントでのみ使用する必要があります。

于 2013-09-29T12:35:52.197 に答える
6

この質問はかなり古くなっていますが、SQL の外部ストレージについてさらに提案したいと思います。Visual Studio (少なくとも 2015 以降) には、*.sql ファイル用の小さなデバッガーと接続マネージャーだけでなく、構文の強調表示があります。ファイルはさらに埋め込みリソースとしてマークされ、アセンブリ内に完全に含まれますが、コードからは分離されます。構文検証されていない文字列に無色の SQL が埋め込まれているのを見るのが嫌になるでしょう。

最近のすべてのプロジェクトでこのパターンを採用し、 Dapperのような ORM と組み合わせると、C# と SQL の間のインターフェイスが非常に最小限になります。私は、Dapper を拡張するオープンソース プロジェクトをGitHubで利用できます。これは、例とNuGet Packageを提供できます。また、口ひげにインスパイアされた文字列置換エンジンも含まれています。これは、スクリプトをテンプレート化して再利用可能にしたり、動的フィルタリング条件を挿入したりするのに役立ちます。

于 2017-12-01T00:18:33.407 に答える