2010-04-23 12 views
0

코드 개선 방법을 모르겠습니다.엔터티 프레임 워크 쿼리

엔티티 P와 엔티티 C라는 두 개의 엔티티가 있습니다. EntityP는 EntityC의 부모입니다. 그것은 1 : 많은 관계입니다. EntityP에는 연결된 모든 EntityC의 속성에 따라 속성이 있습니다.

속성이 올바르게 설정된 EntityP 목록을로드해야합니다. 그래서 EntityP List를 얻기 위해 코드를 작성했습니다. 이것은 entityP_List입니다. 그런 다음 필자가 아래에서 쓴 것처럼 entityP_List를 반복하고 각각에 대해 "NOT EXIST"SQL 쿼리로 번역 될 "any"함수로 데이터베이스를 쿼리합니다. 필자가 사용하는 이유는 첨부 된 모든 entityC를 데이터베이스에서 메모리로로드하고 싶지 않기 때문입니다. 왜냐하면 그 속성의 집계 값만 필요하기 때문입니다. 하지만 여기서 문제는 루프가 각 EntityP에 대해 여러 번 databae를 쿼리한다는 것입니다!

그래서 누구든지 EntityP.IsAll_C_Complete가 메모리에로드되지 않고 한 번만 데이터베이스를 쿼리하도록 코드를 개선 할 수 있다면 궁금합니다.

foreach(EntityP p in entityP_List) 
       { 

         isAnyNotComoplete = entities.entityC.Any(c => c.IsComplete==false && c.parent.ID == p.ID); 
        p.IsAll_C_Complete = !isAnyNotComoplete; 
       } 

대단히 감사합니다.

답변

1

EF 4에서, 당신이 할 수있는 하나 개 DB 쿼리에서 모든 일을 할 것입니다

var ids = entityP_List.Select(p => p.ID); 
var q = (from p in entities.entityP 
     where ids.Contains(p => p.ID) 
     select new 
     { 
      ID = p.ID, 
      IsAll_C_Complete = !p.entityCs.Any(c => !c.IsComplete) 
     }).ToList(); 
foreach (var p in entityP_List) 
{ 
    p.IsAll_C_Complete = q.Where(e.ID == p.Id).Single().IsAll_C_Complete; 
} 

.... EF 1의 경우 BuildContainsExpression을 대신하여 .Contains( 부분을 대신 할 수 있습니다.

+0

감사합니다. 그것은 매력처럼 작동합니다! – Frank

0

테이블이 아닌 SQL보기에서 EntityP를 기반으로합니다. 그런 다음 관계를 정의하고 뷰 내의 하위 테이블 값을 집계합니다.