【问题标题】:Eagerly loading multiple levels with EF 5, .NET 4.5 and Linq使用 EF 5、.NET 4.5 和 Linq 急切地加载多个级别
【发布时间】:2013-01-27 11:29:45
【问题描述】:

我有一个包含国家/地区的数据结构,每个国家/地区可以包含多个锦标赛,每个锦标赛可以包含多场比赛,每场比赛有 2 支球队(主队和客队)。数据设置在具有主键和外键的正常层次结构中。我想获得一个国家列表,其中所有子数据都急切地加载到它们下面,用于在特定日期进行的所有比赛。 这是我需要的东西,尽管系统税全错了。谁能指出我正确的方向?谢谢。

            var countries = Context.sbsCountries
            .Include(c => c.Tournaments
               .Select(t => t.Matches)
                   .Select(m => m.TeamHome)
                   .Select(m => m.TeamAway)
                        )
                    )
            .Where(m => m.date == providedDate)

【问题讨论】:

    标签: .net linq entity-framework eager-loading


    【解决方案1】:

    (已编辑)

    一种方法是先加载所需的匹配项并包含指定的数据,然后获取国家/地区

    var matches = from m in context.Matches
                           .Include(m => m.Tournament)
                           .Include(m => m.TeamHome)
                           .Include(m => m.TeamAway)
                  where m.Date == providedDate
                  select m;
    matches.Load();
    var countries = context.sbsCountries.ToList();
    

    实体框架会自动修复正确的关联,因此每个国家/地区在提供的日期都有自己的Matches

    要完成这项工作,您应该关闭延迟加载,否则当您处理某个县的 Matches 集合时,它将在那时完全加载(如果上下文仍然存在)。

    另一种方法是开始查询匹配项(同样禁用延迟加载)并通过Tournaments 选择不同的国家/地区:

    var matches = (from m in context.Matches
                            .Include(m => m.Tournament)
                            .Include(m => m.TeamHome)
                            .Include(m => m.TeamAway)
                   where m.Date == providedDate
                   select m.Tournament.Country).Distinct();
    

    【讨论】:

    • 您好,感谢您的回复,在这两个示例中,锦标赛(它们位于国家和比赛之间)会发生什么?
    • 我忽略了这一点,但插入锦标赛级别并不太难(幸运的是)。请参阅编辑后的答案。
    • 说得有道理,谢谢,不要认为我从上到下考虑问题有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多