我不知道这是否是正确的做法,我敢肯定有人会告诉我,如果不是这样。实体框架 - 包含在子查询中? - 第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