LINQ-匹配值,如果不匹配,则返回NULL元素

时间:2019-11-07 14:04:07

标签: c# linq linq-to-sql

我有一个给定的日期,我想获取大于给定日期的表中的元素,但是如果找不到,我想返回带有Auto_Open()日期的元素。

例如:

表格:

enter image description here

如果给定的日期是例如2019-10-20,我想返回ID为3的元素。

如果给定的日期是例如2019-11-20,我想返回ID为4的元素。

我尝试这样做:

NULL

但是它总是返回最后一个元素。我该怎么办?

3 个答案:

答案 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元素),则会选择该元素。