どこにSQLを置くべきか?

asp.net-mvc-3 c# dapper n-tier

質問

私は職場のmvc3プロジェクトにdapperを使っています。私はそれが好きです。ただし、dapperを使用すると、アプリケーションをレイヤーする方法はありますか?現在、私はちょうどコントローラ( スラップ )に直接詰め込まれた私のすべてのSQLを持っているが、私は静的な文字列を持つクラスを作ることを考えていた..だから私はできる

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

あなたはdapperを使うときにあなたのsqlをどのように保存しますか?

受け入れられた回答

私は、同等のLINQクエリ、またはDataContext.ExecuteQueryのSQLを置くとsqlを置くと言うでしょう 。それがどこにあるのか...よく、それはあなた次第であり、あなたがどれくらい離れているかによって決まります。

しかし、個人的には、SQLをQuery<T>呼び出しから離れた別のクラスに隠すことの利点はありません。データをコンテキスト(コンテキスト)で見たいので、データ(実際にはパラメータ)を簡単に確認できます。 in-situでクエリを構築することもできます(まだパラメータ化されています)。しかし、通常の静的クエリでは、抽象化が必要な正当な理由がない限り、コードの近くにリテラルとして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ダイアレクトを使用して)異なるデータベースプロバイダをサポートする必要がある場合です。そしてそれは人々が作り出すよりも稀です。


人気のある回答

リソースファイルを使用することは本当に役に立ちます。 .sqlファイルをフォルダ呼び出し/ Sqlに作成し、SqlResourceオブジェクトの 'Files'セクションにドラッグします。リソースファイルの '文字列'セクションは、SQLのより小さなスニペット(例えば、クエリを実行している可能性のある関数)に対して、きれいで簡単です。

だから、私たちのSQLは次のようになります:

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

これにより、リポジトリは本当にきれいに保たれます。また、すべてのsqlをリソースファイルに入れて、エントリを繰り返し処理し、dbオブジェクトがPARSEONLYを使用してクエリを実行できるようにすることで、dbオブジェクトが変更された場合には、 100%信頼できる)。

結論として、私たちにとって、リソースファイルは本物のものをきれいに保ちますが、Marc Gravellにとっては、プロダクションコード内での再利用性がないため、各SQL文はアプリケーションの1つのポイントでのみ使用してください。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow