2017-01-04 4 views
0

Iは、AC#のnoobieけど、ここで私が何をしようとしています何の要旨です:CシャープジェネリックDapperのクエリ二つのテーブル

public IEnumerable<T> GetAll<T, K>(string schemaName) where T : GenericModel 
    { 
     var sql = @"SELECT * from " + 
      schemaName + "." + T.getTableName() + " primaryTable LEFT JOIN " + 
      schemaName + "." + K.getTableName() + 
      " ForeignTable on ForeignTable.id = primaryTable." + T.getForeignFieldName(); 

     return _connection.Query<T, K, T>(sql, (primary, foreign) => 
     { (primary = T.getForeignFieldName()) = foreign; return primary; }); 
    } 

を例T = EmployeeとK =人

としては、
public IEnumerable<Employee> GetAll(string schemaName) 
    { 
     var sql = @"SELECT * from " + schemaName + 
      ".Employee primaryTable LEFT JOIN " + 
      schemaName + ".Person ForeignTable "+ 
      "on ForeignTable.id = primaryTable.person_id"; 
     return _connection.Query<EmployeeModel, PersonModel, EmployeeModel> 
      (sql, (primary, foreign) => { primary.person = foreign; return primary; }); 
    } 

GenericModelは、派生クラス(EmployeePerson)によって影さgetForeignFieldName()getTableName()有する

T一般的な解決策が機能しないと、私は、SQLインジェクションの承知している

もちろん
Person { 
    int id; 
    string Name; 
    string address; 
    int age; 
} 

Employee { 
    int id; 
    int person_id; 
    Person person; 
    double salary; 

}

:彼は例のモデルのように見えるかもしれません。 DapperのQuery()関数で説明した方法を使用できる汎用メソッドが必要です。 Dapper's Multi Mapping

+0

なぜこれをやろうとしていますか?代わりにビュー/ストアド・プロシージャを使用することを検討してください。 – Milney

+0

@Milney 2つのオーバーロードを考えてみましょう.1つは従業員データを返し、もう1つはヌル・ユーザー、もう1つは従業員の問合せ時にPersonデータを戻します。これを一般的なものにしましょう。それはあまりにも多くのビュー(同じ構造を持つ多くのテーブル)です。クエリでは、Personデータが必要なときはいつでもオーバーロードを呼び出すことができますが、 – Achilles

答えて

0

うん、申し訳ありませんが、フレンドリーな方法で - あなたは、クエリの作成:-)予約をオフに迷いました:つまり、あなたがこれを行うことができ、一般的な関数を書くんか

と指定した瞬間はとなります。どのようなデータが返され、どのオブジェクトに返されますか。人々は動的に構築されたSQLを使ってWHERE句やORDER BY句を作成しますが、それはすでに私の見解では完全な反パターンです。どのテーブルについて最終的な決定を延期することで、価値のないクラスが得られます。さらに悪いことに、WHERE句のような重要な可能性を切り捨てたり、返される列を制限したりします。礼儀正しい社会では、2つの結合されたテーブルからすべての行のすべての列を尋ねるのがやや面白いと考えられています。

ストーリーのモラルは、すべてを行う1つのクエリを試してみません。必要なときに必要なものだけを返す、より多くの小さなクエリを作成します。

+0

私はあなたのポイントを見ます。私は、生成されたPOCOSにすべての列を返す "GetAll()"メソッドを含めることを望んでいる人を手伝っていました。それは簡単な作業ですが、私はそれがあまりにも反復的だと思うので、質問です。 – Achilles

+0

問題ありません。私はPOCOの生成について何も理解しませんでした。誰がPOCOを生成していますか? GetAll()メソッドは、必要に応じて、通常はPOCOではなくリポジトリにあります。 POCOのアイデアは、それが["永続性の無知"](http://codeidol.com/community/dotnet/poco-as-a-lifestyle/9476/)です。 – bbsimonbb

+0

役に立つT4スクリプトは、 db情報スキーマ。それぞれの生成されたPOCOに後の段階で書き込むのではなく、作成時にGetAll()を含めるほうが簡単です。私は厳密にPOCOにはデータベース列以外の何かを含むことに反対していますが、ちょっと!人生はめったに公平ではありません。 – Achilles

関連する問題