急切地使用EF 5,.NET 4.5和Linq加载多个级别

时间:2013-01-27 11:29:46

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

我有一个包含国家/地区的数据结构,每个国家/地区可以包含多个比赛,每个比赛可以包含多个比赛,每个比赛有2个球队(主队和客队)。数据在具有主键和外键的正常层次结构中设置。我想获得一个countires列表,其中所有的子数据都在他们下面热切地加载到特定日期播放的所有比赛。 虽然systax完全错了,但这就是我需要的东西。谁能指出我正确的方向?谢谢。

            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)

1 个答案:

答案 0 :(得分: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();