2009-11-02 2 views
2

이것이 올바른 일인지 나는 확신 할 수 없다. 누군가가 그렇지 않은지 말해 줄 것이다.Entity Framework - 하위 쿼리에 포함 하시겠습니까? - 2 부

저는 오늘 저녁에 질문 (Entity Framework - Include in sub query?)을 요청했습니다.이 질문은 아주 잘 대답되어 내 문제를 해결했습니다. 하지만 더 좋은 방법이있을 수 있으므로 질문을 다시하고 조금씩 다르게하겠습니다.

의 내가 3 개 테이블이 있다고 가정 해 봅시다 :

레스토랑 1 ..... M MenuCategory 1 ..... M의 MenuItem 나는 이런 식으로 뭔가 보이는 L2E 쿼리가 :

레스토랑 = 식당 . 포함 (r => r.MenuCategory) .FirstOrDefault (r => r.RestaurantId == resaurantId); 어느 정도까지는 작동하지만 메뉴 범주 만 미리로드합니다.

내가 정말 할 수 있기를 원하는 것은 같은 것입니다 : 작업이 주위에있다 ... r.MenuCategory가 열거

같이 명확하게

Restaurant = context.Restaurant 
.Include(r => r.MenuCategory) 
.Include(r => r.MenuCategory.MenuItems) 
.FirstOrDefault(r => r.RestaurantId == resaurantId); 

그러나이 사용할 수없는

context.Restaurant.Include("MenuCategory.MenuItems"); 

...하지만 강하게 입력되지는 않습니다. 이 질문은 는 강력한 형식의 발견에 관한 것입니다 대답

이 현재의 확장 방법 :

public static ObjectQuery<T> Include<T>(this ObjectQuery<T> query, Expression<Func<T, object>> path) 
{ 
    // Retrieve member path: 
    List<PropertyInfo> members = new List<PropertyInfo>(); 
    EntityFrameworkHelper.CollectRelationalMembers(path, members); 

    // Build string path: 
    StringBuilder sb = new StringBuilder(); 
    string separator = ""; 
    foreach (MemberInfo member in members) 
    { 
     sb.Append(separator); 
     sb.Append(member.Name); 
     separator = "."; 
    } 

    // Apply Include: 
    return query.Include(sb.ToString()); 
} 

이는의 강력한 형식의 양식을 할 수 있도록 적용 할 수있는 방법 :

context.Restaurant.Include("MenuCategory.MenuItems"); 

답변

4

I을 정확하게 이것을 허용하는 팁이 있습니다. Tip 28 - How to implement an eager load strategy

멋진 트릭을 사용합니다.

알렉스

+0

완벽하게, 정확히 내가 한 것. 나는 오늘 밤 그걸로 연극을 할 것이고, 조금만 조정할 수도 있습니다. 고맙습니다! – Paul

+0

방금이 작업을했는데 완벽하게 작동합니다. 새 BlogFetchStrategy()에서 "from"이 아니라 ".IncludeStrategy (new MyStrategy())"와 같이 사용할 수 있도록 확장 메서드를 만들었습니다. ApplyTo (ctx.Blogs) b.Owner == "Alex" 선택 b; " – Paul

+0

그래, 더 좋아 보인다. 나는 항상 나의 접근 방식에 조금 불만했다. 너의 것이 훨씬 좋다. –

1

A가 훨씬 덜 우아하지만 훨씬 빨리 다음과 같은 방법이있을 수 있습니다 구현하려면 :

var list = dataContext.CartLists.Include(typeof(CartListItem).Name).Where(l => l.CustNum == customerNumber && l.ListTypeID == (int)ShoppingCartType.WebShoppingCart).Single(); 

. . . EF 모델 생성기에 엔티티 세트 이름을 복수화하지 않았는지 확인해야합니다. 이는 추악한 솔루션이지만, 테이블 이름이 변경되면 EF 모델을 업데이트 한 후에 컴파일 오류를 발생시켜야합니다. 우리가 수행했던 것처럼 실제로 코드를 실행하지 않아도 문자열이 실제 엔티티와 일치하지 않습니다.