首页 > 解决方案 > 过滤列表中的可为空项 - LINQ

问题描述

为了显示,我有以下列表项。我可以想象下面的小列表,可能是数百行。StartDateEndDate可以是nullable,如果EndDate为null,则表示课程仍然开放。

CourseId    ClassName    StartDate   EndDate      isActiveinDB
--------    ---------    ---------   -------      ------------
12321       Math         08-25-2017  12-02-2017      Y
32342       Math         08-25-2017  12-02-2017      N
25325       Math         01-25-2018     -            Y

如果我通过以下方法通过今天日期(06-06-2018),它会返回我所有课程,而不仅仅是最后一门课程(数学 25325),它基于isActiveinDB.

我想知道以下实现有什么不正确的。

public List<Courses> GetClassesByDate( DateTime date, List<Courses> allCourses)
{
   List<Courses> courses  = allCourses.Where( x => x.StartDate.HasValue ? x.StartDate <= date : true 
                            && x.EndDate.HasValue ? x.EndDate.Value >= date : true 
                            && x.isActiveinDB.Equals("Y")).ToList();
   return courses;
}

感谢@DavidG,实现在以下链接中

标签: c#linq

解决方案


尝试(如果StartDate可以为空,如您所说):

List<Courses> courses  = allCourses.Where( x =>  
                        (x.StartDate.HasValue ? x.StartDate.Value <= date : true)
                        && (x.EndDate.HasValue ? x.EndDate.Value >= date : true) 
                        && x.isActiveinDB.Equals("Y")).ToList();

你看到()我添加的了吗?我觉得你正在做的实际上是

x.EndDate.HasValue ? x.EndDate.Value : (true && isActiveinDB.Equals("Y"))

你看?true不是单个值,而是一个子表达式true && isActiveinDB.Equals("Y")


推荐阅读