【问题标题】:Entity Framework - Include in sub query? - Part 2实体框架 - 包含在子查询中? - 第2部分
【发布时间】:2010-12-12 10:28:21
【问题描述】:

我不确定这是否正确,如果不是,我相信有人会告诉我。

今晚早些时候我问了一个问题 (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");

【问题讨论】:

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


    【解决方案1】:

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

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

    亚历克斯

    【讨论】:

    • 完美,正是我所追求的。今晚我会玩这个,可能会稍微调整一下。谢谢!
    • 我刚刚完成了这项工作,并且运行良好。我创建了一个扩展方法,以便它可以像“.IncludeStrategy(new MyStrategy())”一样使用,而不是“from b in new BlogFetchStrategy().ApplyTo(ctx.Blogs) where b.Owner == “Alex” select b ;"
    • 是的,这似乎更好。我总是对我的方法有点不满意。你的好多了
    【解决方案2】:

    一个不太优雅但实现起来更快的方法可能如下:

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

    。 . .但您需要确保您没有让 EF 模型生成器复数您的实体集名称。这是一种丑陋的解决方案,但是如果您的表名发生更改,一旦您更新 EF 模型,它应该会给您编译错误,就像我们刚才所做的那样,您不必实际执行代码来尝试查找位置您的字符串与实际实体不匹配。

    【讨论】:

      猜你喜欢
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多