2014-01-15 2 views
0

나는 accountId를 기반으로 여러 트랜잭션을 반환하는 메서드가 있습니다.Linq 및 하위 쿼리

var items = (from c in Context.transactions where c.accountid == accountId select c).ToList(); 

나는 그 내 자신의 사용자 정의 DTO 객체로, 엔티티 framerwork 객체를 변환하고, 그 다음 객체를 반환 내가 가진 메서드를 호출 :

그래서, 내 데이터 접근에, 나는 이렇게 내 서비스, 로직 및 MVC 컨트롤러를 통과합니다.

번역기는 인접한 데이터를 가져옵니다. 따라서 내 사용자 지정 DTO에는 'AccountName string'및 'AccountType string'이라는 필드가있을 수 있습니다.

계정 이름이 트랜잭션 테이블의 외래 키인 테이블에 있고 AccountType이 계정 테이블의 외래 키입니다.

var return = new TransactionDto { 
    tranactionId = source.id, 
    accountName = source.Account.Description, 
    accountType = source.Account.AccountType.description 
} 

내가 속도 문제를 갖고있는 것 같다, 그리고 Linq에 대한 이해 비난하는 경우 궁금 :

그래서처럼 내 translater이 보일 것입니다. 나는 초기 데이터 검색에서 ToList()이 선택의 끝이라고 생각했다. 그런 다음 모든 데이터를 var items에 전달합니다. 그러나 실제로는 내 번역사가 실제로 '계정'테이블을 선택한 다음 'AccountType'테이블을 선택합니다. 내 말은, 처음은 'c in Context..'입니다. 모든 외래 key'd 테이블을 얻을?

답변

3

지연로드라고합니다. 필요한 탐색 속성 개체를 열심히로드하려면 Include을 사용하십시오.

var items = Context.transactions 
        .Include("Account") 
        .Include("Account.AccountType") 
        .Where(x => x.accountId == accountId) 
        .ToList(); 
+0

감사합니다. Marcin ... 그래서 내가하고있는 방식대로 inneficient입니까? 'Include'를 사용하면 sql에서 조인을 만들고 멋진 결과 집합을 하나 반환하고 번역기에 더 큰 (그러나보다 효과적이고 효율적인) 모델을 전달합니다. 그러면 Translate 메서드 내에서 SQL 호출이 수행되지 않습니다. – Craig

+0

정확히. 이 SQL 쿼리에 포함 된 모든 속성을 다운로드합니다. – MarcinJuraszek