나는 교류 #의 noobie,하지만 여기에 내가 뭘하려고 오전의 요지입니다 :C 샤프 일반 단정 한 쿼리 두 테이블
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 = 직원 및 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
Person {
int id;
string Name;
string address;
int age;
}
Employee {
int id;
int person_id;
Person person;
double salary;
}
는 물론 일반 솔루션이 작동하지 않습니다 내가 SQL 주입 알고 있어요 :처럼 그는 예를 들어 모델 보일 수 있습니다. Dapper의 Query() 함수로 설명한 방식을 사용할 수있는 일반적인 메서드가 필요합니다. 쿼리의 생성 :-) 예약을 꾸는 한 - Dapper's Multi Mapping가
왜이 작업을 수행하려고합니까? 대신보기/저장 프로 시저 사용을 고려하십시오. – Milney
@Milney 두 개의 오버로드를 고려하십시오. 하나는 Employee 데이터를 반환하고 다른 하나는 Null 인 것으로, 다른 하나는 Employee가 쿼리 될 때 Person 데이터를 반환합니다. 이제 그것을 일반화해라. 그것은 너무 많은 뷰 (비슷한 테이블을 가진 많은 테이블)이다. 반면 쿼리를 사용하면 Person 데이터가 필요할 때마다 과부하를 호출 할 수 있습니다. – Achilles