过滤列表中的可空项目 - LINQ

cas*_*las 0 c# 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
Run Code Online (Sandbox Code Playgroud)

如果我通过以下方法通过今天的日期(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;
}
Run Code Online (Sandbox Code Playgroud)

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

xan*_*tos 5

尝试(如果可以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();
Run Code Online (Sandbox Code Playgroud)

你看到()我添加了吗?事实上,你在做什么

x.EndDate.HasValue ? x.EndDate.Value : (true && isActiveinDB.Equals("Y"))
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上我认为这仍然是错误的,OP只是在`isActiveinDB`之前缺少`x.所以很可能使用内部变量. (3认同)
  • @hotspring [使用上面发布的确切代码证明它工作正常](https://dotnetfiddle.net/14tcWZ) (3认同)