2011-02-22 2 views
1

내 엔터티 모델에서 항목 목록을 검색하는 ASP.net MVC 컨트롤러 작업이 있습니다. 이 엔터티에는 엔터티 자체에없는 몇 가지 속성이 있습니다. 다음 속성을 추가하기 위해 부분 클래스를 만들었습니다.Entity Framework - 관련 데이터 가져 오기

public partial class Person 
{ 
    public int Extra 
    { 
     get 
     { 
      using(var ctx = new DBEntities()) 
      { 
       return ctx.OtherTable.Count(p => p.PersonID == this.PersonID); 
      } 
     } 
    } 
} 

위에서 볼 수 있듯이 액세스해야하는 속성은 다른 테이블에서 가져온 것입니다. 내 MVC 페이지에서 ... 나는 많은 사람들 (페이지 당 100 개 이상)을 반환해야합니다. 이 Extra 필드를 표시하기 위해 각 Person 엔티티는 데이터베이스를 개별적으로 타격 할 것이므로 매우 비효율적입니다. 나는 모든 사람들을 돌려주는 하나의 질의를 가지고 있고, 각각의 사람들을 위해 나는 이것과 같은 각 속성에 대한 질의를 가지고있다. 이로 인해 데이터베이스에 대한 300 건의 호출이 끝날 수 있으며, 실행하는 데 오랜 시간이 걸립니다.

더 좋은 방법은 무엇입니까? 모든 People과 여분의 데이터를 반환하는 하나의 쿼리를 실행하는 것이 이상적이지만 데이터베이스의 별도 테이블에있는 경우에도 추가 데이터를 Person 엔터티의 일부로 만들고 싶습니다.

업데이트 코멘트에서 좀 더 컨텍스트를 추가합니다.

저장소 클래스에서 피플을 반환합니다. 다른 질문에서 저장소는 엔티티 자체 만 다루어야한다고 들었습니다. 따라서 사람들을 검색하는 코드는 다음과 같습니다.

class PersonRepository 
{ 
    public IQueryable<Person> GetPeople() { 
     return from p in db.People 
       where p ... 
       select p; 
    } 
} 

이 경우에 가입 할 수있는 옵션이 없습니다.

답변

1

조인 :

var result = 
    from p in ctx.Persons 
    from a in ctx.OtherTable 
    where p.PersonID == personID 
    select new SomeViewModel 
    { 
     Name = p.Person.Name, 
     OtherTableValue = a.OtherValue 
    }; 
+0

사람들이 저장소에 검색 할 수있는 코드입니다. 또 다른 질문으로, 저장소가보기 모델을 반환하는지 여부를 묻습니다. 나는 당신의 실체 만 반환해야한다고 들었다. – Dismissile

+0

@Dismissile, 맞습니다. 충분히 공정한 다음 클래스 이름에서 ViewModel 접미어를 제거하고 도메인 모델로 만듭니다. –

+0

@Dismissile, 리포지토리를 수정하고 두 개의 결합 된 EF 모델의 집계를 나타내는 새 도메인 모델을 반환해야합니다. 이 작업을 수행하지 않으면 N + 1 선택 문제로 인해 어려움을 겪을 수 있습니다. –

1

데이터베이스 디자인이 어떻게 이루어 졌는지 확실하지 않습니다. 하지만 왜 두 개의 관련 테이블에서 데이터를 조인하고 데이터를 여러 번 누르지 않고 한 번만 기록 할 수 있습니까? 속도가 느릴지라도이 데이터를 캐시하고 세션이 종료되는 동안 액세스 할 수 있습니다. 당신이 할 수있는

관련 문제