如何使用LINQ查询对SQL Server时态表应用日期范围筛选?
如何使用LINQ查询对SQL Server时态表应用日期范围筛选?
看起来你已经把SQL Server时态表和EF Core的配置都搞定了,单个时间点的查询也跑通了,那咱们来聊聊怎么用LINQ实现日期范围的时态表筛选吧,分几种常见场景给你示例:
1. 查询某一特定时间点的地址状态(你正在用的场景,再明确下写法)
如果要获取指定ID的地址在某个精确时间点的状态,用TemporalAsOf方法即可:
public async Task<Address> GetAtDate(long id, DateTime targetDate) { var address = await _context.Addresses .TemporalAsOf(targetDate) // 指定要查询的时间点 .FirstOrDefaultAsync(a => a.Id == id); return address; }
2. 查询某段时间范围内的所有地址版本
如果你想获取从startDate到endDate之间存在过的所有历史版本(包括这段时间内生效的当前版本),用TemporalBetween方法:
public async Task<List<Address>> GetAddressVersionsInRange(long id, DateTime startDate, DateTime endDate) { var addressVersions = await _context.Addresses .TemporalBetween(startDate, endDate) // 筛选逻辑:ValidFrom <= endDate 且 ValidTo >= startDate .Where(a => a.Id == id) .ToListAsync(); return addressVersions; }
3. 查询从某个时间点到现在的所有版本
要是你需要查看某地址从startDate开始到当前的所有变更版本,用TemporalFrom方法:
public async Task<List<Address>> GetAddressVersionsSince(long id, DateTime startDate) { var addressVersions = await _context.Addresses .TemporalFrom(startDate) // 筛选ValidFrom >= startDate的所有版本(包含当前生效版本) .Where(a => a.Id == id) .ToListAsync(); return addressVersions; }
4. 查询到某个时间点为止的所有历史版本
反过来,要是想获取某地址到endDate为止的所有历史版本(不含当前生效版本,除非当前版本在endDate前已失效),用TemporalTo方法:
public async Task<List<Address>> GetAddressVersionsUpTo(long id, DateTime endDate) { var addressVersions = await _context.Addresses .TemporalTo(endDate) // 筛选ValidTo <= endDate的所有历史版本 .Where(a => a.Id == id) .ToListAsync(); return addressVersions; }
几个实用注意点:
- 这些
TemporalXXX扩展方法是EF Core 3.0及以上版本针对SQL Server时态表提供的专属功能,确保你的EF Core版本达标 - 你可以在查询里叠加其他筛选条件(比如
Where(a => a.IsDeleted == false)),和普通LINQ查询的写法完全一致 - 查询返回的
Address实体会自动带上对应版本的ValidFrom和ValidTo值,直接就能看到该版本的生效时间范围
备注:内容来源于stack exchange,提问作者moptr matrio
相关产品推荐
相关产品推荐

