我正在修改一些现有代码(使用现有数据库)以使用Entity Framework Code First。我正在努力掌握的一个领域是一张拥有自己历史的桌子。项目按原始ID分组(因此对项目的更新会创建一个具有相同原始ID的新条目),如此
- id = 1, originalid = 1 <-- oldest item in history
- id = 2, originalid = 1 <-- subsequent update
- id = 3, originalid = 1 <-- latest item
等
每个项目也有一个用户ID,我经常需要获取用户的所有数据,但是我看到顶级(最新)项目,其历史记录作为最新项目对象的属性,如此
id = 3 (because id 3 is that latest for the grouping with original id 1)
history { id = 1, id = 2 } (the other items with original id 1)
我现在正在讨论最新项目,加上一个存储过程来获取其历史记录,但我觉得在数据库上单击一下就可以更有效地获取用户的所有内容,然后在代码中重新排列成分组。
但我不知道怎么做。
注意我仅限于.NET 4,因此无法利用EF 5中的某些功能。
有什么建议吗?
提前致谢。
答案 0 :(得分:1)
在层次结构中只有两个级别,您可以简单地执行类似..
的操作int userId = 1;
var query = items.Where(i => i.userid == userId).GroupBy(i => i.originalid).Select(i => new
{
LatestItem = i.OrderByDescending(x => x.id).First(),
History = i.OrderByDescending(x => x.id).Skip(1).Select(x => new
{
id = x.id,
originalid = x.originalid
}).ToList()
}).ToList();
你需要测试性能,但它应该能够为你提供你所看到的效果。