Dapperを使用してT-SQLビューからオブジェクトを移入する

c# dapper multi-mapping

質問

私はデータアクセスのためにDapperを使って試しています(ASP.NET MVC3 FWIWで)。私はT-SQLビュー(SQL Server)を次のようにしています:

SELECT s.*, c.CompanyId AS BreakPoint c.Name AS CompanyName
FROM tblStaff AS s
INNER JOIN tblCompanies AS c ON c.CompanyId = s.CompanyId

とてもシンプルです。基本的に、それぞれが単一の会社を持つスタッフのリスト。

私は、このクエリの出力をPOCOにマップしようとしているのですが、Viewの各フィールドが一意でなければならない(つまり、tblStaffに既に存在するNameではなくCompanyName)ため、POCOへのマッピング動作していません。

コードは次のとおりです:

var sql = @"select * from qryStaff";
var people = _db.Query<Person, Company, Person>(sql, (person, company) => {person.Company = company; return person;}, splitOn: "BreakPoint");

どのように私はこのパズルを解決する可能性がある任意のアドバイス?私は現在私がどのように進歩するかについて困惑しているように私はビューを行う方法を変更するために開いています。

人気のある回答

ビューから返されたすべてのフィールドを明示的にリストし(アスタリスクを付けないでください)、フィールド名が固有ではない場合は、別名を使用して重複排除します。例として:

SELECT 
    s.CompanyName as CompanyName1, 
    s.BreakPoint as BreakPoint1,
    ...
    c.CompanyId AS BreakPoint,
    c.Name AS CompanyName
FROM tblStaff AS s
INNER JOIN tblCompanies AS c ON c.CompanyId = s.CompanyId

リストされたフィールドとあなたが使うかもしれないエイリアスは、もちろん、完全にあなたのコードに依存します。通常、POCOのプロパティ名と一致するようにクエリのエイリアスを調整します。

また、一般的な経験則として、SQLクエリでワイルドカードを使用しないようにすることをお勧めします。これは、このような問題が発生するためです。 これがSQLクエリのベストプラクティスに関するまともな記事です。

抜粋:

コード内のSELECTステートメントで明示的な列名を使用すると、いくつかの利点があります。まず、SQL Serverはアプリケーションが必要とするデータのみを返しており、アプリケーションが使用しないであろう追加のデータの集まりではありません。必要なデータのみを返すことで、SQL Serverが必要なすべての情報列を集めるために必要な作業量を最適化しています。また、アスタリスク(*)の命名法を使用しないことで、SELECTステートメントに関連付けられたデータをアプリケーションに送信するのに必要なネットワークトラフィック量(バイト数)も最小限に抑えられます。

さらに、列に明示的に名前を付けることで、SELECTステートメントで参照しているテーブルに起こる可能性があるデータベーススキーマの変更に関連する潜在的な障害からアプリケーションを保護します。アスタリスク(*)の命名法を使用していて、誰かが新しい列をテーブルに追加すると、アプリケーションコードを変更しなくても、アプリケーションはこの追加のデータ列のデータを受け取り始めます。アプリケーションが特定の数の列のみが返されることを期待している場合、他の誰かが参照先のテーブルの1つに追加の列を追加するとすぐに失敗します。したがって、SELECTステートメントで列に明示的に名前を付けることで、SELECTステートメントで参照されているテーブルのいずれかに新しい列を追加した場合でも、アプリケーションは常に同じ数の列を返します。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ