我正在尝试过滤接下来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));
}
答案 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));
}