내 엔터티 모델에서 항목 목록을 검색하는 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;
}
}
이 경우에 가입 할 수있는 옵션이 없습니다.
사람들이 저장소에 검색 할 수있는 코드입니다. 또 다른 질문으로, 저장소가보기 모델을 반환하는지 여부를 묻습니다. 나는 당신의 실체 만 반환해야한다고 들었다. – Dismissile
@Dismissile, 맞습니다. 충분히 공정한 다음 클래스 이름에서 ViewModel 접미어를 제거하고 도메인 모델로 만듭니다. –
@Dismissile, 리포지토리를 수정하고 두 개의 결합 된 EF 모델의 집계를 나타내는 새 도메인 모델을 반환해야합니다. 이 작업을 수행하지 않으면 N + 1 선택 문제로 인해 어려움을 겪을 수 있습니다. –