2009-11-02 57 views
2

我不知道這是否是正確的做法,我敢肯定有人會告訴我,如果不是這樣。實體框架 - 包含在子查詢中? - 第2部分

今天早上我問了一個問題(Entity Framework - Include in sub query?),這個問題得到了很好的回答,並解決了我的問題。但是,我認爲可能有更好的方法,所以我會重新提出這個問題,但稍有不同。

比方說,我有3個表:

餐廳1 .....中號MenuCategory 1 .....中號菜單項 我有一個L2E查詢看起來是這樣的:

餐廳= context.Restaurant .Include(r => r.MenuCategory) .FirstOrDefault(r => r.RestaurantId == resaurantId); 這在某種程度上起作用,但它只是預加載菜單類別。

我真的希望能夠做的是一樣的東西:

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

但顯然作爲r.MenuCategory是一個枚舉

這是不可用......的解決辦法是使用標準符號:

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

我有一個提示,允許這一點:Tip 28 - How to implement an eager load strategy

使用一個漂亮的技巧,我認爲。

亞歷

+0

完美的,正是我以前的樣子。那麼今晚我會有一場比賽,可能會稍微調整一下。謝謝! – Paul 2009-11-03 08:24:13

+0

我剛剛得到這個工作,它的工作完美。我創建了一個擴展方法,以便它可以像「.IncludeStrategy(new MyStrategy())」而不是「從新的BlogFetchStrategy()中的b」那樣使用。選擇b;「 – Paul 2009-11-03 23:02:47

+0

是的,這似乎更好。我對我的方法總是有點不高興。你的更好 – 2009-11-04 01:00:58

1

一種較優雅,但能更快地實現方法可能如下:

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

。 。 。但您需要確保您沒有EF模型生成器將您的實體集名稱複數化。這是一種醜陋的解決方案,但是,如果您的表名更改了,那麼一旦您更新EF模型,它就會給您編譯錯誤,就像我們剛纔所做的一樣,您將不必實際執行代碼來嘗試查找位置你的字符串不符合實際的實體。