我不知道這是否是正確的做法,我敢肯定有人會告訴我,如果不是這樣。實體框架 - 包含在子查詢中? - 第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");
完美的,正是我以前的樣子。那麼今晚我會有一場比賽,可能會稍微調整一下。謝謝! – Paul 2009-11-03 08:24:13
我剛剛得到這個工作,它的工作完美。我創建了一個擴展方法,以便它可以像「.IncludeStrategy(new MyStrategy())」而不是「從新的BlogFetchStrategy()中的b」那樣使用。選擇b;「 – Paul 2009-11-03 23:02:47
是的,這似乎更好。我對我的方法總是有點不高興。你的更好 – 2009-11-04 01:00:58