Dapper를 사용하여 T-SQL보기에서 개체 채우기

c# dapper multi-mapping

문제

Dapper를 사용하여 데이터 액세스를 시도하고 있습니다 (ASP.NET MVC3 FWIW에서). 나는 (SQL Server에서) 다음과 같은 T-SQL 뷰를 가지고있다.

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 문에서 참조하는 모든 테이블에 발생할 수있는 일부 데이터베이스 스키마 변경과 관련된 잠재적 인 실패로부터 응용 프로그램이 격리됩니다. asterick (*) 명명법을 사용하고 누군가가 테이블에 새 열을 추가하는 경우 응용 프로그램 코드를 변경하지 않고도이 추가 열 데이터에 대한 데이터를 받기 시작합니다. 응용 프로그램에서 특정 수의 열만 반환 될 것으로 예상하는 경우 누군가가 참조 된 테이블 중 하나에 추가 열을 추가하자 마자 실패합니다. 따라서 SELECT 문에서 명시 적으로 열의 이름을 지정하면 누군가가 SELECT 문에서 참조 된 테이블 중 하나에 새 열을 추가하더라도 응용 프로그램에서 항상 동일한 수의 열을 반환합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.