2

1 : n 관계로 카테고리 및 제품이라는 두 개의 엔티티가 있습니다.EF 코드 첫 번째 로딩 및 OrderBy 문제

자녀가있는 자녀가있는 카테고리를 주문하고 싶습니다.

_db.Categories.Where(c => c.CategoryID == catID) 
    .Include(c => c.Products.OrderBy(p => p.ProductID)) 
    .SingleOrDefault(); 

이 쿼리 때문에 ORDERBY의 아래 예외 적용 :

이 내 LINQ이다.

는 경로식이 유형에 정의 된 탐색 속성에 를 참조해야합니다 포함합니다. 참조 탐색 속성에는 점선으로 된 경로를 사용하고 탐색 속성에는 선택 연산자를 사용하십시오. 매개 변수 이름 : 경로

답변

1

Include은 당신이 OrderBy()을 포함 할 수 없음을 의미 탐색 속성을 참조 할 수있다. 대신이의 : 당신이 Category에 속성을 추가 할 수 있습니다, 각 Category에 대한 Products의 정렬 된 목록에 액세스 할 수

_db.Categories 
    .Where(c => c.CategoryID == catID) 
    .Include(c => c.Products) 
    .SingleOrDefault(); 

... :

_db.Categories 
    .Where(c => c.CategoryID == catID) 
    .Include(c => c.Products.OrderBy(p => p.ProductID)) 
    .SingleOrDefault(); 

... 당신은이를 사용해야합니다 like :

class Category 
{ 
    public IEnumerable<Product> OrderedProducts 
    { 
     get { return this.Products.OrderBy(p => p.ProductID); } 
    } 
} 
5

Eager로드 된 데이터는 정렬되거나 필터링 될 수 없습니다. 즉 LINQ - 투 - 엔티티 제한하고있다 프로젝션을 사용하여 데이터베이스에서 관계를 주문하는 유일한 방법은 방법 :

var data = _db.Polls 
       .Where(c => c.CategoryID == pollID) 
       .Select(c => new 
        { 
         Pool = c, 
         Products = c.Products.OrderBy(p => p.ProductID) 
        }) 
       .SingelOrDefault(); 

당신은 익명 또는 사용자 정의 형식으로 투사 할 수 있지만, 예를 Poll에 대한 매핑 유형 (에 투사 할 수 없습니다).

또 다른 방법은 두 쿼리에이를 나누어 명시 적 로딩 사용된다

var poll = _db.Polls.SingleOrDefault(c => c.CategoryID == pollID); 
_db.Entry(poll).Collection(c => c.Products) 
       .Query() 
       .OrderBy(p =>.ProductID) 
       .Load(); 
관련 문제