长时间潜伏,第一次发布,并且新学习EF4和MVC3。
我需要帮助确保在这种情况下我使用正确的数据加载策略以及一些帮助最终确定查询的一些细节。我目前正在使用概述here的热切加载方法来处理某个“仪表板”视图,该视图需要来自大约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 ?)
非常感谢有关如何解决这些剩余需求以及确保最佳性能的任何意见,指导或建议。
答案 0 :(得分:1)
您对查询大小的关注以及size of the result set are tangible。
由于@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)
...
});
答案 1 :(得分:0)
不幸的是,EF不允许使用其导航属性选择性地加载相关实体,如果您指定Foos
,它将始终加载所有Include("Foo")
。
您必须使用Where()
子句作为过滤器对每个相关实体进行联接。