4

长期潜伏,第一次发帖,新学习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 的整体大小和连接的数量,并且我认为我可能需要一个不同的数据加载方法。(显式加载?多个 QueryObjects?POCO?)

非常感谢任何有关如何解决这些剩余需求以及确保最佳性能的意见、方向或建议。

4

2 回答 2

1

您对查询大小和结果集大小的关注是有形的

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

        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)
                              ... 
                          });
于 2011-06-28T07:28:31.370 回答
0

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

您将必须在每个相关实体上使用您的Where()子句作为它们适用的过滤器进行连接。

于 2011-06-27T20:12:03.497 回答