Linq:日期小于 x,但下一个记录日期大于 x
Linq: Date less that x, but next record date is greater that x
我在数据库中得到了记录。每条记录都有字段 "Date"。
对于给定的日期=x,我需要找到日期值小于 x,但下一个记录日期大于 x 的记录。
示例:
id date
--------------
1 12.03.2013
2 15.03.2013
3 18.03.2013
现在,我得到了 X=16.03.2013
,我需要一个 LINQ return 这条记录:
2 15.03.2013
但是!对于 X=15.03.2014
它应该 return 什么都没有(因为有记录的日期较小,但下一条记录的日期与 X 完全相同)
我该怎么做?
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
(因此根本没有 "next" 记录),此 不会 起作用。我还没有想出办法来处理这个问题。
如果所有值都可以小于 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
我在数据库中得到了记录。每条记录都有字段 "Date"。 对于给定的日期=x,我需要找到日期值小于 x,但下一个记录日期大于 x 的记录。
示例:
id date
--------------
1 12.03.2013
2 15.03.2013
3 18.03.2013
现在,我得到了 X=16.03.2013
,我需要一个 LINQ return 这条记录:
2 15.03.2013
但是!对于 X=15.03.2014
它应该 return 什么都没有(因为有记录的日期较小,但下一条记录的日期与 X 完全相同)
我该怎么做?
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
(因此根本没有 "next" 记录),此 不会 起作用。我还没有想出办法来处理这个问题。
如果所有值都可以小于 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