c# - Entity Framework - 包含在子查询中? - 第2部分

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

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

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

假设我有 3 个表:

餐厅 1.....M 菜单类别 1.....M 菜单项 我有一个 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");

最佳答案

我有一个提示可以实现这一点:Tip 28 - How to implement an eager load strategy

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

亚历克斯

关于c# - Entity Framework - 包含在子查询中? - 第2部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1663783/

相关文章:

c# - 我怎样才能从几个表达式的并集组成一个表达式树?

c# - Linq lambda 表达式多对多表选择

c# - 在 C# 和 Objective-C 之间维护通用代码的好方法是什么?

c# - 如何在 WPF 中与其他类型绑定(bind)?

c# - 到本地 Sql Express Server 的并发 SqlConnection 和 EntityConnection

c# - 如何在 Entity Framework 中使用 DateTime.AddDays(x)

c# - 实现接口(interface)的抽象基类

c# - 可以自动将元素添加到集合中吗?

c# - 在非常复杂的多任务窗体程序中锁定和使用 Entity Framework 上下文是否可以?

c# - 如何在Mysql EF6 C#中根据存储过程生成复杂类型