동적 반환 유형

.net c# dapper orm

문제

나는 잠시 동안 Dapper.net을 사용해 왔으며 .Net 동적 유형과 잘 작동하는 아주 좋은 ORM 매퍼입니다.

하지만 Dapper가 데이터베이스에서 데이터를 검색 할 때 Dapper 행 유형으로 반환된다는 사실을 알게되었습니다.

System.Dynamic.ExpandoObject 와 같은 다른 형식으로 반환 할 수있는 방법이 있습니까?

수락 된 답변

DapperRow 개체는 행 사이에 많은 상태를 공유하도록 설계되었습니다. 예를 들어 40 개의 행을 가져 오는 경우 열 이름 등은 한 번만 저장됩니다. ExpandoObject 를 사용하는 경우 행 당 구성해야합니다. 따라서 DapperRow 를 배경 구현 세부 정보로 사용하는 것은 고의적 인 효율성 문제입니다.

dynamic API에서 반환 된 개체는 IDictionary<string,object> 로 캐스팅 될 수도 있습니다.

그러나이 사전 사용법을 지원하는 다른 유형 ( ExpandoObject 는 하나)을 지원하는 ExpandoObject 입니다. 예, 다음과 같이 변경 될 수 있습니다.

var rows = conn.Query<ExpandoObject>(...);

공장. 코드를 지원 하기 만하면됩니다. 코드는 현재 존재하지 않습니다. 그래서 "아니,하지만 미래의 건축물에서."

당신이 사용할 필요가 없습니다 것을 유의하십시오 DapperRow 전혀 ... 더 많은 예상 시나리오는 자신의 유형을 구체화하기 위해 일반적인 API를 사용하는 것입니다.


인기 답변

확실한!

dapper 설명서에 따라 쿼리 방법을 사용하고 다이내믹을 얻습니다.

dynamic account = conn.Query<dynamic>(@"
                    SELECT Name, Address, Country
                    FROM Account
            WHERE Id = @Id", new { Id = Id }).FirstOrDefault();
Console.WriteLine(account.Name);
Console.WriteLine(account.Address);
Console.WriteLine(account.Country);

보시다시피 동적 객체를 얻고 쿼리 문에서 잘 정의되어있는 한 속성에 액세스 할 수 있습니다.

.FirstOrDefault().FirstOrDefault() 하면 IEnumerable<dynamic> 을 얻을 수 있으며, 원하는대로 수행 할 수 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow