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
は、派生クラス(Employee
とPerson
)によって影さ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
なぜこれをやろうとしていますか?代わりにビュー/ストアド・プロシージャを使用することを検討してください。 – Milney
@Milney 2つのオーバーロードを考えてみましょう.1つは従業員データを返し、もう1つはヌル・ユーザー、もう1つは従業員の問合せ時にPersonデータを戻します。これを一般的なものにしましょう。それはあまりにも多くのビュー(同じ構造を持つ多くのテーブル)です。クエリでは、Personデータが必要なときはいつでもオーバーロードを呼び出すことができますが、 – Achilles