在 LINQ 中使用聚合查询进行自联接
本文关键字:查询 LINQ | 更新日期: 2023-09-27 18:30:23
我有一个 C# 模型类与具有实体框架的数据库相关联。在我的模型中,我记录用户的值,以及记录条目的时间。我想要的是返回一组条目,这些条目仅表示给定 UserID 的最新记录。
我可以使用聚合查询(最大日期,按用户 ID 分组)和自联接来实现这一点,以将这些参数与正确的记录相匹配。
DECLARE @UserValues
TABLE
(
id INT IDENTITY(1,1) PRIMARY KEY,
UserID INT,
Value CHAR,
RecordedAt DATETIME
)
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 3, 'a', '2014-11-06';
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 3, 'b', '2014-11-08';
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 3, 'c', '2014-11-04';
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 5, 'f', '2014-11-03';
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 5, 'h', '2014-11-23';
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 5, 'w', '2014-11-07';
select straight_data.*
from
(
select UserID as UserID,
MAX(RecordedAt) as RecordedAt
from @UserValues
group by UserID
) as max_date
join @UserValues as straight_data
on max_date.RecordedAt = straight_data.RecordedAt
and max_date.UserID = straight_data.UserID
结果只是每个用户的最新记录:
id UserID Value RecordedAt
5 5 h 2014-11-23 00:00:00.000
2 3 b 2014-11-08 00:00:00.000
在这里看到它的实际效果:http://sqlfiddle.com/#!6/7c4dc/1
所以问题是,如何在 LINQ 中对类似
ICollection<UserValues> MyUserValues;
您可以通过以下步骤在 linq 中执行此操作:
按用户 ID 分组
按记录时间(降序)对每个组进行排序
从每个"组"中选择第一个。
var dataByUserAndMaxDate =
MyUserValues.GroupBy(m => m.UserId)
.Select(m => m.OrderByDescending(x => x.RecordedAt).First());
如果您使用 MoreLinq,还有一个MaxBy
扩展方法(仅适用于 linq to 对象)