2011-02-13 1 views
1

내 모델 개체의 컬렉션과 각각의 특정 유형의 자식 수를 반환하는 공통 프로젝트가 필요합니다. 가능한 경우 또는 모델 클래스의 "TotalCount"속성을 모델링하고이를 단일 Entity Framework 쿼리의 일부로, 가급적 LINQ 쿼리를 사용하여 채우는 방법을 모릅니다. Entity Framework를 사용할 수있는 동안이 작업을 수행 할 수 있습니까? 포함 ("Object") 및 .Skip() 및 .Take()? 나는 Entity Framework에 익숙하지 않아서 이것을 허용 할 수있는 확실한 물건이 누락 될 수 있습니다 ...Entity Framework 4.0 - 모델 개체 반환 목록 + 개체 당 어린이 수

동적으로 구성된 계수 속성에도 페이지 매김을하고 싶습니다. 가장 확장 성있는 접근 방식은 개수를 별도의 데이터베이스 속성으로 저장 한 다음 단순히 개수 속성을 쿼리하는 것이라고 생각합니다. 그러나 내가 다루는 행 수가 적을 경우 동적으로 계산을 수행합니다.

표 : 클래스

테이블 : 교수

테이블 : 참석자

테이블 : ClassComment

내가 돌아 싶습니다

목록이 같은 모델에서

클래스 개체를 List 형식으로 표시하지만 참석자 수와 클래스 주석을 단일 쿼리 (LINQ 선호)로 결정할 수도 있습니다. AttendeeCount 및 ClassCommentCount라는 두 개의 클래스 속성에 설정됩니다.

나는 지금까지이 있습니다

var query = from u in context.Classes 
      orderby tl.Name 
      select u; 

List<Class> topics = ((ObjectQuery<Class>)query) 
    .Include("ClassComments") 
    .Skip(startRecord).Take(recordsToReturn).ToList(); 

없음 아직 .Include() 및 페이지 매김의 사용을 허용 할 수 있습니다 제안이나 대안 쿼리 방법이 훨씬 많이 주시면 감사하겠습니다, 단일 데이터베이스 쿼리를 생산하기 위해 , 가능하다면. 어떤 제안을 해주셔서 감사합니다!

답변

3

이 시도해보십시오.

+0

감사합니다. LukLed, 당신의 제안은 Ladislav 's와 비슷합니다. 나는 이런 유형의 접근법을 시도 할 것이다. 하지만 여전히 확실하지 않은 한 가지는 페이지 매김을 적용하기 전에 count 속성에 의해 익명 형식으로 투영 된 레코드를 정렬 할 수 있습니까? –

+0

@Shan Plourde : 업데이트 된 답변을 확인하십시오. 주문할 수 있습니다. – LukLed

2

이렇게하면 작동하지 않습니다. 가장 쉬운 방법은 익명 (또는 사용자 지정) 비 엔터티 형식으로 프로젝션을 사용하는 것입니다. 나는 다음과 같은 것을 시도 할 것이다 :

var query = context.Classes 
       .Include("ClassComments") // Only add this if you want eager loading of all realted comments 
       .OrderBy(c => c.Name) 
       .Skip(startRecord) 
       .Take(recordsToReturn) 
       .Select(c => new 
       { 
        Class = c, 
        AttendeeCount = c.Attendees.Count(), 
        ClassCommentCount = c.ClassComments.Count() // Not needed because you are loading all Class comments so you can call Count on loaded collection 
       }); 

문제는 AttendeeCount와 ClassCommentCount 속성이다. 데이터베이스에 해당 열이 없으므로 모델에 쉽게 추가 할 수 없습니다 (하나를 정의하지 않으면 수동으로 레코드를 계산할 필요가 없습니다). 부분 클래스 구현에서 정의 할 수 있지만 이러한 경우에는 Linq와 엔터티 쿼리에서 사용할 수 없습니다.

EF에서 이것을 매핑하는 유일한 방법은 DB보기를 사용하고 응용 프로그램에서이를 표현하기위한 특수 읽기 전용 엔티티를 작성하거나 DefiningQuery을 사용하는 것입니다. 이는 DB 테이블이나 뷰 대신 SSDL에 정의 된 사용자 정의 SQL 명령입니다.

public class ClassViewModel { 
    public Class Class { get; set; } 
    public int AttendeeCount { get; set; } 
    public int ClassCommentCount { get; set; } 
} 


var viewModel = context.Classes.Select(clas => 
    new ClassViewModel { 
     Class = clas, 
     AttendeeCount = clas.ClassAttendes.Count, 
     ClassCommentCount = clas.ClassComments.Count} 
).OrderBy(model => model.ClassCommentCount).Skip(startRecord).Take(recordsToReturn).ToList(); 

당신은 수를 얻을 주석을 포함 할 필요가 없습니다 :

+0

원시 Entity 클래스 인스턴스를 반환해야한다는 개념에 얽매여있는 것 같지만이 접근 방식을 소용돌이가되게 할 것입니다. 이러한 개수 속성을 기반으로 EF 페이지 매김을 구현하려면 속성이 데이터베이스 열 또는 데이터베이스 뷰 여야합니까? 감사합니다 –

+0

@Shan : 당신이 무엇을 요구하고 있는지 잘 모르겠습니다. 페이지 매김을 유지하려면 상점 수를 지속적으로 유지할 필요가 없습니다.페이지 매김은 Skip and Take에 의해 유도되며 올바른 값을 전달하는 것은 사용자의 책임입니다. Count는 대개 UI에서 일부 호출기를 만들고 실제로 DB에있는 항목의 수를 표시하는 데에만 사용됩니다. –

+0

나는 전체 카운트를 지속적으로 저장하는 것이 페이지 매김을 구현하기위한 전제 조건이 아니라는 것을 알고 있습니다. LukQ가 동적 카운트 값을 사용하여 LINQ to Entity Framework 투영에 페이지 매김을 구현하는 것이 가능한지 확실하지 않았습니다. 나는 EF에 꽤 새로 왔습니다.) –

관련 문제