使用EF Database First的单表分层数据

时间:2014-02-01 22:13:13

标签: c# .net sql-server entity-framework entity-framework-4

我正在修改一些现有代码(使用现有数据库)以使用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中的某些功能。

有什么建议吗?

提前致谢。

1 个答案:

答案 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();

你需要测试性能,但它应该能够为你提供你所看到的效果。