在单个LINQ查询中查找日期范围是否包含当前日期,如果不包含,则查找最新日期

u0njafvf  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(116)

目前正在按年份拉回具有不同日期范围的实体列表。因此,表中一条记录的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();
    }
oug3syen

oug3syen1#

您可以通过连接两个结果来实现这一点。这里的优点是数据库可以使用索引。

using (var ctx = ContextFactory.CreateDbContext())
{
    va query = ctx.entity1.AsNoTracking().Where(e => e.Column1 == thisId);

    query = query
        .Where(e => e.StartDate < DateTime.UtcNow && e.StopDate > DateTime.UtcNow)
        .Take(1)
        .Concat(query.OrderByDescending(e => e.StopDate).Take(1));

    entity1 = await query.FirstOrDefaultAsync();
}
daolsyd0

daolsyd02#

这是代码,First Check条件,如果条件为true,返回该值,否则,返回最新日期(使用排序是强制性的,但首先比较条件)

var _result = context.entity1.AsNoTracking()
.OrderByDescending(d=>d.StopDate).FirstOrDefault(e => e.Column1 == 10 &&
        (

        (e.StartDate < DateTime.UtcNow && e.StopDate > DateTime.UtcNow

        ) ? 
(e.StartDate < DateTime.UtcNow && e.StopDate > DateTime.UtcNow) : (1 == 1)  )  );

结果
当条件为真时,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|

相关问题