【发布时间】:2011-05-21 22:42:49
【问题描述】:
我有两个实体:
- 位置
- 发布
1..* 在 Location 和 Post 之间。
Location 是抽象的,我有许多派生实体,例如 City。我为我的模型使用 Table-Per-Type 继承。
我正在尝试编写以下查询:(简化)
- 获取排名前 20 的城市,并包含“评分最高的帖子”(最高评分)。
因此,Location 有一个名为 Posts 的导航属性。
要记住的一件事 - 我禁用延迟加载,因此我必须预先加载,或者执行两个查询。
所以,这是我目前的查询。请记住,我需要从这个方法返回一个ICollection<Location>:
public ICollection<Location> FindTopTwentyLocations()
{
var results = new List<Location>();
var cities = locationRepository
.Find()
.OfType<City>()
.Select(x => new
{
Location = x,
TopPost = x.Posts.OrderByDescending(r => x.Rating).FirstOrDefault()
}).Take(20).ToList();
foreach (var city in cities)
{
var aggregatedCity = city.Location;
aggregatedCity.Posts = new List<Post> { aggregatedCity.TopPost };
results.Add(city);
}
return results;
}
所以本质上,我抓取了前 20 个城市,投影到一个匿名类型,这样我就可以抓取顶部的帖子,然后循环遍历该匿名类型的集合,将帖子推回“城市 "对象,以便添加到List<Location>的返回类型中。
- 我不能使用
.Include,因为它会返回所有帖子 - 我不想执行 2 个查询
- 我必须使用匿名类型投影,否则会抛出 EF 错误(无法翻译查询)
考虑到这些要点,有没有更好的方法可以做到这一点?我对var cities 查询相当满意,但我不太喜欢将匿名类型属性循环/复制到我的模型实体。
有什么想法吗?
编辑
我还注意到匿名类型的投影正在丢失我正在检索的急切加载的位置关联。
例如
var query = locationRepository.Find().OfType<City>().Include("State").ToList();
有效 - 返回所有“状态”关联。
但是:
var query = locationRepository.Find().OfType<City>().Include("State").Select(x => new {
Location = x,
TopPost = x.Posts.OrderByDescending(r => x.Rating).FirstOrDefault()
}).ToList();
导致所有“状态”关联为空。
奇怪!
【问题讨论】:
标签: linq entity-framework entity-framework-4 linq-to-entities eager-loading