我有一个给定的日期,我想获取大于给定日期的表中的元素,但是如果找不到,我想返回带有Auto_Open()
日期的元素。
例如:
表格:
如果给定的日期是例如2019-10-20,我想返回ID为3的元素。
如果给定的日期是例如2019-11-20,我想返回ID为4的元素。
我尝试这样做:
NULL
但是它总是返回最后一个元素。我该怎么办?
答案 0 :(得分:2)
您可以尝试以下方法:
mockMvc
.perform(post("/book")
.with(jwt().authorities(new SimpleGrantedAuthority("booking:WRITE"))))
我们会在该日期创建一个初始的有序查询,并列出一个评估查询的列表。
接下来,我们检查第一个给定的日期是否符合期望的结果。
否则,我们尝试获取第一个空行。
然后您可以处理最后的案件。
为避免对查询进行两次解析,您可以使用它:
var query = _db.Parameter
.OrderBy(x => x.EndDate)
.ToList();
var parameter = query.FirstOrDefault(x => givenDate < x.EndDate);
if ( parameter == null )
parameter = query.FirstOrDefault(x => x.EndDate == null);
if ( parameter == null )
...
else
...
因为我无法测试和调试,所以希望此循环能够正常工作...
答案 1 :(得分:2)
我将不使用LINQ来优化代码:
var parameter = _db.Parameter[0]; // you may need to handle that there's at least 1 item.
for (int i = 1; i < _db.Parameter.Count; i++)
{
var param = _db.Parameter[i];
if (param.EndDate > givenDate)
{ // param is good
if (parameter.EndDate == null || parameter.EndDate > param.EndDate)
parameter = param; // replace parameter with param
}
else if (parameter.EndDate != null && parameter.EndDate < givenDate)
{ // parameter precedes given date, replace it!
parameter = param;
}
}
与到目前为止提供的其他解决方案不同,这将仅遍历您的列表一次。
如果您必须使用LINQ并且要迭代一次,也许可以使用下面的代码,尽管它会返回一个动态值,所以您需要将其转换回Parameter
。它的工作原理是将NULL
替换为DateTime.MaxValue
,这样当您执行OrderBy
时,NULL
的条目将在底部排序。
var param = _db.Parameter
.Select(x => new
{
ID = x.ID,
EndDate = (x.EndDate.HasValue) ? x.EndDate : DateTime.MaxValue,
Value = x.Value
})
.OrderBy(x => x.EndDate)
.FirstOrDefault();
var parameter = new Parameter()
{
ID = param.ID,
EndDate = (param.EndDate == DateTime.MaxValue) ? null : param.EndDate,
Value = param.Value
};
答案 2 :(得分:1)
如注释中所述,NULL将在订购后首先出现。 如果您尝试以下操作怎么办:
var parameter = _db.Parameter
.Where(x => (x.EndDate > givenDate) || (x.EndDate == null))
.OrderBy(x => x.EndDate)
.Last();
仅选择较早的日期后,才选择最新的日期。如果列表中只有一个元素(NULL元素),则会选择该元素。