目前正在按年份拉回具有不同日期范围的实体列表。因此,表中一条记录的StartDate和StopDate分别为01/01/2020和12/31/2020。对于下一个记录,StartDate和StopDate分别为01/01/2021和12/31/2021。等等。我现在的逻辑计算出今天是否落在两个日期之间,如果不是,就得到具有最新日期的实体。下面是我的逻辑,但我想构建一个只带回单个实体而不使用服务器资源的linq查询。
Entity1 entity1{ get; set; }
List<Entity1> entity1List { get; set; }
using (var ctx = ContextFactory.CreateDbContext())
{
entity1List = await ctx.entity1.AsNoTracking().Where(e => e.Column1 == thisId).ToListAsync();
entity1 = entity1List.Where(e => e.StartDate < DateTime.UtcNow && e.StopDate > DateTime.UtcNow).FirstOrDefault();
entity1 = entity1 ?? entity1List.OrderByDescending(e => e.StopDate).FirstOrDefault();
}
2条答案
按热度按时间oug3syen1#
您可以通过连接两个结果来实现这一点。这里的优点是数据库可以使用索引。
daolsyd02#
这是代码,First Check条件,如果条件为true,返回该值,否则,返回最新日期(使用排序是强制性的,但首先比较条件)
结果
当条件为真时,entity 1:
| 色谱柱1|开始日期|停止日期|
| --------------|--------------|--------------|
| 十个|2012-05-21 00:00:00.0000000| 2021-05-14 00:00:00.0000000|
| 十个|2022-01-24 00:00:00.0000000| 2021-01-27 00:00:00.0000000|
结果:
| 色谱柱1|开始日期|停止日期|
| --------------|--------------|--------------|
| 十个|2012-05-21 00:00:00.0000000| 2021-05-14 00:00:00.0000000|
当条件为false时,entity 1:
| 色谱柱1|开始日期|停止日期|
| --------------|--------------|--------------|
| 十个|2012-05-21 00:00:00.0000000| 2025-05-14 00:00:00.0000000|
| 十个|2022-01-24 00:00:00.0000000| 2021-01-27 00:00:00.0000000|
结果:
| 色谱柱1|开始日期|停止日期|
| --------------|--------------|--------------|
| 十个|2012-05-21 00:00:00.0000000| 2025-05-14 00:00:00.0000000|