实体框架 - 包含在子查询中? - 第2部分

时间:2009-11-02 21:22:38

标签: c# entity-framework linq-to-entities include

我不确定这是否是正确的做法,我相信有人会告诉我它是不是。

我今天早些时候提出了一个问题(Entity Framework - Include in sub query?),这个问题得到了很好的回答并解决了我的问题。但是,我认为可能有更好的方法,所以我会重新提出问题,但略有不同。

假设我有3张桌子:

餐厅1 ..... M MenuCategory 1 ..... M MenuItem 我有一个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");

2 个答案:

答案 0 :(得分:4)

我有一个提示,允许这样:Tip 28 - How to implement an eager load strategy

我认为使用了一个漂亮的技巧。

亚历

答案 1 :(得分:1)