2013-04-11 2 views
1

이 구조는 다음과 같습니다 두통이다내 응용 프로그램에서

public ActionResult GetList() 
{ 
    using(DbConnection db = new DbConnection) 
    { 
     var query = db.Routes.ToList(); 
    } 

    return PartialView(query); 
} 

을 입력 한 다음 데이터를 표시합니다.

@foreach (var r in Model) 
{ 
    <div>@r.AddressA.Name - @r.AddressB.Name</div> 
} 

그러나 문제는 View/PartialView가 using 대괄호 뒤에 표시되어 AddressA의 이름에 액세스하려고 시도하기 때문에 테이블이 가득 차게로드되지 않아서 오류가 발생합니다. 예, 할 수있다 :

을하지만, 나는 코드가 포함 된 모든 정말 추한 점점 시작이 작은 조금 더 복잡한 쿼리를 할 때. 이 간단한 코드 줄 또는 .Include("A").Include("B").Include("X.Y.Z")보다 덜 못생긴 코드로이 문제를 극복 할 수있는 방법이 있습니까?

+0

람다 버전의 포함을 사용할 수 있습니다. 또는 게으른 로딩을 완전히 끌 수 있습니다. 아니면 가장 좋은 해결책은 뷰 모델을 사용하여 using 블록 내부의 필수 데이터로 채우는 것입니다. – nemesv

+0

만약 당신이 viewmodels을 제안하는 당신의 대답을 움직일 수 있다면, 나는 받아 들일 수있을 것입니다 :) 나는이 방법으로 가서 꽤 행복합니다 :) –

답변

1

lambda versionInclude이며 유형 안전성 만 제공하지만 문제는 해결되지 않습니다.

또는 turn off lazy loading을 사용하면 "문제 포함"문제를 해결할 수 있지만 지연로드 기능의 유효한 사용 사례는 사용할 수 없게됩니다.

은보기에서 엔티티를 사용하지 않고보기 모델을 만들고 using 블록 내부의 필수 데이터로 채 웁니다.

그래서 뷰 ​​모델은 다음과 같이 보일 것이다 :

public class AddressViewModel 
{ 
    public string AddressAName { get; set; } 
    public string AddressBName { get; set; } 
} 

이 그런 다음 컨트롤러는 뷰 모델을 만들 수 있습니다

: 쉽게보기에서 사용할 수있는

public ActionResult GetList() 
{ 
    using(DbConnection db = new DbConnection) 
    { 
     var query = db.Routes.Select(r => 
      new AddressViewModel 
       { 
        AddressAName = r.AddressA.Name, 
        AddressBName = r.AddressB.Name, 

       }).ToList(); 
    } 

    return PartialView(query); 
} 

@foreach (var r in Model) 
{ 
    <div>@r.AddressAName - @r.AddressBName</div> 
} 
+0

당신의 도움과 멋진 철저한 답변을 주셔서 감사합니다. :) –