Linq:日期少于x,但下一个记录日期大于x

时间:2015-04-28 09:04:24

标签: c# .net linq

我在数据库中有记录。每条记录都有字段"日期"。 对于给定的日期= x,我需要查找Date值小于x的记录,但下一个记录日期大于x。

示例:

id  date
--------------
1   12.03.2013
2   15.03.2013
3   18.03.2013

现在,我得到X=16.03.2013,我需要一个返回此记录的LINQ:

 2  15.03.2013

BUT!对于X=15.03.2014它应该什么都不返回(因为有记录的日期较小,但是下一条记录的日期与X完全相同)

我该怎么做?

2 个答案:

答案 0 :(得分:3)

最简单的方法IMO只是找到 找到的记录,然后检查日期:

var result = db.Table
               .Where(x => x.Date <= target.Date)
               .OrderByDescending(x => x.Date)
               .FirstOrDefault();
if (result != null && result.Date == target.Date)
{
    result = null;
}

或者可以在过滤到单个结果后使用辅助Where子句在查询中完成所有操作:

var result = db.Table
               .Where(x => x.Date <= target.Date)
               .OrderByDescending(x => x.Date)
               .Take(1)
               .Where(x => x.Date != target.Date)
               .FirstOrDefault();

请注意,如果所有值都小于x,则此不会工作(因此没有&#34;下一个&#34;记录完全) 。我还没有办法解决这个问题。

答案 1 :(得分:1)

如果所有值都小于x,则可以使用

var candidate = dates.Where(x => x.Date < target.Date)
                   .OrderByDescending(x => x.Date)
                   .FirstOrDefault();
    var next = dates.Where(x => x.Date >= target.Date)
                   .OrderBy(x => x.Date)
                   .FirstOrDefault();
     return (candite != null && next != null && next.Date != target.Date) ? candidate : null