C# 首先使用EF数据库的单表分层数据

C# 首先使用EF数据库的单表分层数据,c#,.net,sql-server,entity-framework,entity-framework-4,C#,.net,Sql Server,Entity Framework,Entity Framework 4,我正在修改一些现有代码(使用现有数据库)以首先使用实体框架代码。我正在努力处理的一个领域是一张桌子,上面有自己的历史。项目按其原始id分组(因此对项目的更新会创建一个具有相同原始id的新条目),如下所示 目前,我正在通过查看最新的项目以及获取其历史记录的存储过程来解决这个问题,但我觉得,如果用户只需点击一次数据库,就可以获得所有信息,然后在代码中重新排列到分组中,会更加高效 但我不知道怎么做 注意:我仅限于.NET4,因此无法利用EF5中的某些功能 有什么建议吗 提前感谢。在层次结构中只有两个级

我正在修改一些现有代码(使用现有数据库)以首先使用实体框架代码。我正在努力处理的一个领域是一张桌子,上面有自己的历史。项目按其原始id分组(因此对项目的更新会创建一个具有相同原始id的新条目),如下所示

目前,我正在通过查看最新的项目以及获取其历史记录的存储过程来解决这个问题,但我觉得,如果用户只需点击一次数据库,就可以获得所有信息,然后在代码中重新排列到分组中,会更加高效

但我不知道怎么做

注意:我仅限于.NET4,因此无法利用EF5中的某些功能

有什么建议吗


提前感谢。

在层次结构中只有两个级别,您可以简单地执行以下操作:

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

您需要测试性能,但它应该提供您想要的东西。

您想要实现什么这个表很清楚,但实际的问题不是。@GGG-是否总是并且只有两个级别的项目层次结构,或者可以(例如)你有{id:1,原始id:1},{id:2,原始id:1},{id:3,原始id:2}?@Jon是的,只有一个“最新项目”和一个级别的“历史”其中包含所有相关项目。@Danny我只想在一次点击中获得“最新”项目及其历史记录,我认为Jon已经解决了下面的问题,我将在上午检查并确认。很好的一个@Jon,我还没有测试过,但我明天会测试。不过看起来不错-这里的关键是分组方式。一旦我检查了它的工作原理,我会把它标记为答案,但我不明白为什么它不工作,而且你们已经清楚地理解了我的要求。谢谢。@GGG没问题。很好,谢谢@Jon。我根据自己的需要(定义了自己的自定义容器对象)稍微修改了它,并删除了ToList(),但基本原则起了作用。
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)
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();