C# Datetime的LINQ到SQL检查为null或小于当前日期

C# Datetime的LINQ到SQL检查为null或小于当前日期,c#,entity-framework,linq,datetime,C#,Entity Framework,Linq,Datetime,我需要进行LINQ查询,该查询将运行SQL查询 Select * from Employee where Employee.StartDate is null OR (Employee.StartDate is not null AND Employee.StartDate > GetDate()) 我尝试了以下代码 Employee.Where(e => e.StartDate == null || (e.StartDate != null &&

我需要进行LINQ查询,该查询将运行SQL查询

    Select * from Employee where Employee.StartDate is null OR 
(Employee.StartDate is not null AND Employee.StartDate > GetDate())
我尝试了以下代码

    Employee.Where(e => e.StartDate == null || 
(e.StartDate != null && e.StartDate > Datetime.Today);

    Employee.Where(e => e.StartDate.HasValue == false || 
(e.StartDate.HasValue != false && e.StartDate > Datetime.Today);

    Employee.Where(e => e.StartDate..Equals((DateTime?)null) || 
(e.StartDate.HasValue != false && e.StartDate > Datetime.Today);
但它并没有生成正确的SQL来检查这两个

var thresholdDate = GetDate();
var employeesWithNewOrNoStartDate = dbContext.Employees
    .Where(employee => employee.StartDate == null
                    || employee.StartDate > thresholdDate);
简言之:

从所有
员工
的顺序中,仅选取那些根本没有
起始日期
的员工,或者具有全新的
起始日期

var NewGroupEmployees = dbContext.Employees
.Where(employee => employee.StartDate == null
                || employee.StartDate > DateTime.Today).ToList();
简言之:

从所有
员工
的顺序中,仅选取那些根本没有
起始日期
的员工,或者具有全新的
起始日期

var NewGroupEmployees = dbContext.Employees
.Where(employee => employee.StartDate == null
                || employee.StartDate > DateTime.Today).ToList();
这将返回一个包含所需结果的列表

您可以尝试的另一个选项是在SQL中创建存储过程,并从应用程序中调用它

这将返回一个包含所需结果的列表


您可以尝试的另一个选项是在SQL中创建一个存储过程,并从应用程序中调用它。

我似乎不知道我在注释中的意思。几乎可以肯定,属性
StartDate
是根据需要映射的。这可以通过数据注释来完成

[Required]
public DateTime? StartDate { get; set; }
…或通过流畅的映射,例如在
OnModelCreating

modelBuilder.Entity<Employee>()
    .Property(e => e.StartDate).IsRequired();
modelBuilder.Entity()
.Property(e=>e.StartDate).IsRequired();
只有在这些情况下,EF才会忽略LINQ表达式中的(not-)null检查,因为它知道属性不能为null


当然,将一个可为null的属性标记为required没有多大意义,所以您应该要么使其不可为null,要么使其不为required。

我似乎不知道我在注释中的意思。几乎可以肯定,属性
StartDate
是根据需要映射的。这可以通过数据注释来完成

[Required]
public DateTime? StartDate { get; set; }
…或通过流畅的映射,例如在
OnModelCreating

modelBuilder.Entity<Employee>()
    .Property(e => e.StartDate).IsRequired();
modelBuilder.Entity()
.Property(e=>e.StartDate).IsRequired();
只有在这些情况下,EF才会忽略LINQ表达式中的(not-)null检查,因为它知道属性不能为null



当然,将可为Null的属性标记为required没有多大意义,因此您应该将其设置为not nullable或not required。

LINQ to SQL!=实体框架。您使用哪种ORM?您能显示这些语句生成的SQL吗?我使用EF 6.0SQL语句生成的目的只是检查StartDate是否大于当前值,而不是检查nullIs
StartDate
是否根据需要通过属性或流畅的映射进行映射?LINQ到SQL!=实体框架。您使用哪种ORM?您能显示语句生成的SQL吗?我使用EF 6.0SQL语句生成来检查StartDate是否大于当前值,而不检查nullIs
StartDate
是否按要求映射,通过属性还是通过fluent映射?我运行了SQL Profiler,生成的SQL不会生成检查null的检查在这种情况下,StartDate似乎不可为null(至少在模型中)Ankit:也许你应该编辑这个问题并添加你的
员工
classI-ran SQL Profiler,SQL generated不会生成检查null的检查在这种情况下,StartDate似乎不可为null(至少在模型中)Ankit:也许你应该编辑问题并添加你的
员工
类。很遗憾,这不编译到必需的SQL查询,也不检查空日期。很遗憾,这不编译到必需的SQL查询,也不检查空日期