EF4中的数据加载策略/语法

本文关键字:策略 语法 加载 数据 EF4 | 更新日期: 2023-09-27 18:00:27

长期潜伏,首次发布,新学习EF4和MVC3。

在这种情况下,我需要帮助确保我使用了正确的数据加载策略,并需要一些帮助来完成查询的一些细节。我目前正在使用这里概述的热切加载方法来实现某种程度上的"仪表板"视图,该视图需要来自大约10个表(都有FK关系)的少量数据。

            var query = from l in db.Leagues
                 .Include("Sport")
                 .Include("LeagueContacts")
                 .Include("LeagueContacts.User")
                 .Include("LeagueContacts.User.UserContactDatas")
                 .Include("LeagueEvents")
                 .Include("LeagueEvents.Event")
                 .Include("Seasons")
                 .Include("Seasons.Divisions")
                 .Include("Seasons.Divisions.Teams")
                 .Where(l => l.URLPart.Equals(leagueName))
                         select (l);
            model = (Models.League) query.First();

然而,我需要对我无法计算出的数据进行一些额外的过滤、排序和整形。以下是我在这一点上的主要需求/担忧:

  • 一些子对象仍然需要额外的过滤,但我还没能找出语法或最佳方法。示例:"TOP 3 LeagueEvents.Event WHERE StartDate>=getdate()ORDER BY LeagueEvents.Event.StartDate"

  • 我需要对一些字段进行排序。示例:ORDERBY Seasons.StartDate、LeagueEvents.Event.StartDate和LeagueContacts.User.SortOrder等

  • 我已经非常关心这个查询生成的SQL的总体大小和联接的数量,并且认为我可能需要一种不同的数据加载方法。(显式加载?多个查询对象?POCO?)

对于如何解决这些剩余需求以及确保最佳性能的任何意见、指导或建议,我们将不胜感激。

EF4中的数据加载策略/语法

您对查询大小和结果集大小的关注是显而易见的。

正如@BrokenGlass所提到的,EF不允许您在includes上进行过滤或订购。如果你想排序或过滤关系,你必须使用投影到匿名类型或自定义(非映射)类型:

        var query = db.Leagues
                      .Where(l => l.URLPart.Equals(leagueName))
                      .Select(l => new 
                          {
                              League = l,
                              Events = l.LeagueEvents.Where(...)
                                                     .OrderBy(...)
                                                     .Take(3)
                                                     .Select(e => e.Event)
                              ... 
                          });

不幸的是,EF不允许使用其导航属性选择性地加载相关实体,如果指定Include("Foo"),它将始终加载所有Foos

您必须在每个相关实体上使用Where()子句作为应用它们的筛选器来进行联接。