【发布时间】:2012-11-15 23:32:16
【问题描述】:
我目前有这个示例数据表:
ID | Policy ID | History ID | Policy name
1 | 1 | 0 | Test
2 | 1 | 1 | Test
3 | 2 | 0 | Test1
4 | 2 | 1 | Test1
除此之外,我想按策略 ID 和历史 ID (MAX) 分组,所以我要保留的记录是 ID 的 2 和 4:
ID | Policy ID | History ID | Policy name
2 | 1 | 1 | Test
4 | 2 | 1 | Test1
我尝试在 LINQ 中执行此操作,但每次都遇到同样的问题。我可以对我的实体进行分组,但总是将它们分组到一个我必须重新定义属性的组中,而不是将它们从我的 Policy 对象中保留下来。如:
var policies = _context.Policies.GroupBy(a => a.intPolicyId)
.Select(group => new {
PolicyID = group.Key,
HistoryID = group.Max(a => a.intHistoryID)
});
这只是列出了其中包含“策略 ID”和“历史 ID”的对象列表。我想要从 Policies 对象返回的所有属性,而不必重新定义它们,因为该对象中有大约 50 多个属性。
我试过了:
var policies = _context.Policies.GroupBy(a => a.intPolicyId)
.Select(group => new {
PolicyID = group.Key,
HistoryID = group.Max(a => a.intHistoryID)
PolicyObject = group;
});
但这会出错。
有什么想法吗?
【问题讨论】:
-
这里我有点困惑:如果 intPolicyID 是 Policies 表的主键,为什么要按它分组?它将始终返回表中的每一行,因为每个 intPolicyID 都是唯一的。
-
我认为这只是我自己一个绝望的编码失误才能让它工作。实际上,我猜它只会按每一行的历史 ID 分组。
-
好的。在这种情况下,您也不能按历史 ID 分组。不确定您是否有真正想要分组的客户 ID 或其他字段。但这是此过程中的第 1 步。
-
重新阅读您的问题我认为您想要的是每个政策,您想要最新的“历史”对象,并且您假设每个政策的最大历史 ID 是最新的。但是,历史记录项是否保存在策略表中?它们很可能保存在“历史记录”表或类似的东西中。您可能应该 _context.Histories.GroupBy(a => a.intPolicyId),因为 intPolicyID 可以在历史表中出现多次。这只是一个猜测,因为我看不到您的架构。
-
哦,实际上,您可能在这里找到了可以加快查询速度的东西,我也会尝试实施这种方法并检查速度...