2009-11-02 63 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模型,它就会给您编译错误,就像我们刚才所做的一样,您将不必实际执行代码来尝试查找位置你的字符串不符合实际的实体。