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

C# EF4中的数据加载策略/语法,c#,linq,entity-framework,entity-framework-4,ef4-code-only,C#,Linq,Entity Framework,Entity Framework 4,Ef4 Code Only,长期潜伏者,第一次发帖,新学习EF4和MVC3 我需要帮助以确保在本例中使用了正确的数据加载策略,还需要帮助确定查询的某些细节。我目前使用的是为“仪表板”视图概述的急切加载方法,该视图需要来自大约10个表(所有表都有FK关系)的少量数据 然而,我需要对我无法计算的数据进行一些额外的过滤、排序和整形。以下是我的主要需求/关注点: 几个子对象仍然需要额外的过滤,但我还没有弄清楚语法或最佳方法。示例:“前三名LeagueEvents.Event,其中StartDate>=getdate()按Leag

长期潜伏者,第一次发帖,新学习EF4和MVC3

我需要帮助以确保在本例中使用了正确的数据加载策略,还需要帮助确定查询的某些细节。我目前使用的是为“仪表板”视图概述的急切加载方法,该视图需要来自大约10个表(所有表都有FK关系)的少量数据

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

  • 几个子对象仍然需要额外的过滤,但我还没有弄清楚语法或最佳方法。示例:“前三名LeagueEvents.Event,其中StartDate>=getdate()按LeagueEvents.Event.StartDate排序”

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

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


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

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


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

您对查询大小的关注以及

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


简明扼要!您的代码示例正是我试图实现的。我还对您链接的相关答案进行了投票,并完全回答了我关于占地面积和性能的其余问题。谢谢
            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();
        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)
                              ... 
                          });