Мне нужно сделать запрос 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 для проверки обоих.

0
Ankit 20 Авг 2018 в 16:39

3 ответа

Лучший ответ

Я не могу сказать, что я имею в виду в комментариях. Почти наверняка, свойство StartDate отображается как требуется. Это может быть сделано аннотациями данных ...

[Required]
public DateTime? StartDate { get; set; }

... или беглым отображением, например, в OnModelCreating ...

modelBuilder.Entity<Employee>()
    .Property(e => e.StartDate).IsRequired();

Только при этих обстоятельствах EF будет игнорировать (не) нулевую проверку в выражении LINQ, потому что, как известно, свойство не может быть нулевым.

Конечно, не имеет смысла помечать свойство, допускающее обнуляемость, как требуется, поэтому вы должны либо сделать его не обнуляемым, либо не обязательным.

2
Gert Arnold 20 Авг 2018 в 21:26
var NewGroupEmployees = dbContext.Employees
.Where(employee => employee.StartDate == null
                || employee.StartDate > DateTime.Today).ToList();

Это должно вернуть список с желаемым результатом.

Другой вариант, который вы можете попробовать - создать хранимую процедуру в SQL и вызвать ее из своего приложения.

0
Clinton Okorie 20 Авг 2018 в 14:39
var thresholdDate = GetDate();
var employeesWithNewOrNoStartDate = dbContext.Employees
    .Where(employee => employee.StartDate == null
                    || employee.StartDate > thresholdDate);

В словах:

Из последовательности всех Employees берут только те Employees, у которых вообще нет StartDate, ИЛИ с довольно новым StartDate

1
Harald Coppoolse 20 Авг 2018 в 13:57
51932017