如何获取日期差异linq

时间:2019-12-19 13:04:03

标签: c# linq asp.net-core asp.net-core-webapi

我正在尝试过滤接下来14天之内的生日。即使在构建中也没有显示错误。所有数据都会显示给结果。但是在运行时,它会抛出“ InValidOperationException”(CS0119)。

        if (filterModel.IsNextBirthday.HasValue)
        {
            var filteredResult = result.Where(x => x.People.SelectMany(s => s.Details).Any(m => 
                                 ((m.BirthDate).Subtract(DateTime.Today)).Days < 14));
        }

2 个答案:

答案 0 :(得分:0)

我不确定是否可以使用Linq完成此操作。

但是,我可以告诉您为什么失败。

考虑这部分((m.BirthDate).Subtract(DateTime.Today)).Days

BirthDate - DateTime.Today始终为负(除非他们今天出生,则为0),因此总是少于14天。这就是为什么所有数据都出现在结果中的原因-您的查询匹配所有人,甚至包括今天出生的人。

如果您将其交换为DateTime.Today.Subtract(m.Birthdate),则天数将远远大于14天(除非该人在最近的14天内出生)。

一种方法是从计算中删除年份。正如我所说,我不知道是否可以使用Linq来完成此操作,但是逻辑将如下所示:

var birthdateThisYear = m.BirthDate.AddYears(DateTime.Today.Year - m.BirthDate.Year);
var daysUntilBirthday = (birthdateThisYear - DateTime.Today).Days
if (daysUntilBirthday < 14 && daysUntilBirthday >= 0)
{
    // birthday is within 14 days and birthday has not been this year
}

如果您使用的是Linq,则可能需要物化该集合,然后才能使用.NET类型和方法(例如TimeSpan)。

也许这对您有用(物化集合首先调用ToList):

result.ToList()
      .Where(x => x.People
      .SelectMany(s => s.Details)
      .Any(m => (m.BirthDate.AddYears(DateTime.Today.Year - m.BirthDate.Year).Subtract(DateTime.Today)).Days < 14));

您还需要检查它是否不是负数,这表示今年已经过生日。

答案 1 :(得分:0)

尝试更改生日和今天的出生日期

if (filterModel.IsNextBirthday.HasValue)
    {
        var filteredResult = result.Where(x => x.People.SelectMany(s => s.Details).Any(m => 
                             ((DateTime.Today).Subtract(m.BirthDate)).Days < 14));
    }