Dapper.net을 사용하여 다중 매핑 쿼리를 사용하면 예기치 않은 동작이 일어납니다.

asp.net c# dapper mapping

문제

나는 방금 Dapper.net을보고 방금 몇 가지 다른 쿼리를 실험 해 보았습니다. 그 중 하나는 예상하지 못한 이상한 결과를 만들어 내고 있습니다.

나는 2 개의 테이블을 가지고있다 - Photos & PhotoCategoriesCategoryID 와 관련이있다.

사진 테이블

CategoryId (PK - smallint)  
CategoryName (nvarchar(50))

PhotoCategories 테이블

CategoryId (PK - smallint)  
CategoryName (nvarchar(50))

나의 2 개의 과목 :

CategoryId (PK - smallint)  
CategoryName (nvarchar(50))

관련 PhotoCategory 의 채워진 인스턴스가있는 다중 매핑을 사용하여 Photo 의 인스턴스를 반환하고 싶습니다.

CategoryId (PK - smallint)  
CategoryName (nvarchar(50))

이 작업이 실행될 때 모든 속성이 채워지지는 않습니다 (DB 테이블과 내 개체간에 동일한 이름 임에도 불구하고).

나는 'p. * etc.'을 선택 don'tSQL 에서 대신.

나는 명시 적으로 들판을 진술한다.

나는 돌아가려면 EXCLUDING p.CategoryId 한 후 모든 (I SELECT 문에서 제외 한 사진 개체에 대한 분명 카테고리 ID 제외) 인구 도착, 쿼리에서.

그러나 나는 그 필드를 질의에 포함시킬 수있을 것이고, SQL 내에서 질의되는 다른 모든 필드들도 채워질 것으로 예상 할 것이다.

Photo 클래스에서 CategoryId 속성을 제외하고 ID가 필요할 때 항상 Photo.PhotoCategory.CategoryId 사용할 수 있습니다.

그러나 어떤 경우에는 Photo 개체의 인스턴스를 가져올 때 PhotoCategory 개체를 채우고 싶지 않을 수도 있습니다.

아무도 왜 위의 문제가 발생하는지 알고 있습니까? Dapper가 정상입니까?

수락 된 답변

방금이 문제를 해결했습니다.

classes: A{Id,FooId} B{FooId,Name}
splitOn: "FooId"
data: Id, FooId, FooId, Name

다중 매퍼에 필드가 있다면 혼동하기 한 first 또한에서 우연히 형 second 타입 ... AND ... 분할 점으로서 사용 하였다.

Id 필드가 첫 번째 유형의 아무 곳에 나 나타날 수 있도록 이제 dapper를 극복하십시오. 설명하기.

우리가 가진 말 :

classes: A{Id,FooId} B{FooId,Name}
splitOn: "FooId"
data: Id, FooId, FooId, Name

이전의 분할 방법은 매핑하는 실제 기본 유형을 고려하지 않았습니다. 그래서 ... 그것은 Id => AFooId, FooId, Name => B 매핑합니다.

새로운 방법A 의 소품 및 필드를 인식합니다. 스트림에서 처음 FooId 를 만났을 때, AFooId 라는 속성이 매핑되어 있어야한다는 것을 알고 있기 때문에 분할을 시작하지 않습니다. 다음에 FooId 가 분할되어 결과가 예상됩니다.


인기 답변

나는이 질문이 오래되었다는 것을 알고 있지만 이것에 대한 명백한 대답으로 2 분을 구할 것이라고 생각했다 : 하나의 테이블에서 하나의 별명을 별칭 :

즉 :

SELECT
    user.Name, user.Email, user.AddressId As id, address.*
FROM 
    User user
    Join Address address
    ON user.AddressId = address.AddressId



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