Как я могу реорганизовать свой метод, чтобы он возвращал свое логическое выражение как код, а не как логическое значение напрямую. Мне это нужно для запроса EF Core, поэтому очень важно, чтобы код возвращался как делегат.
private static bool AreNotNull(DateTime? dateTime1, DateTime? dateTime2)
=> dateTime1 != null && dateTime2 != null;
Нет, я собираю выражения и внутри выражений я называю эти функции Func<>
EF задохнется, если вы передадите ему выражение, вызывающее внутренний делегат. Неудивительно, поскольку нельзя ожидать, что скомпилированный делегат превратится в SQL.
Вы не можете вызывать делегатов из выражений Entity Framework, которые будут преобразованы в SQL. Вам нужно будет использовать выражения.
Вы можете сделать это так:
private static Func<bool> AreNotNull(DateTime? dateTime1, DateTime? dateTime2)
=> () => dateTime1 != null && dateTime2 != null;
Обновлять: Как уже отмечалось, вам не нужно оценивать каждый раз, когда вызывается метод:
private static Func<bool> AreNotNull(DateTime? dateTime1, DateTime? dateTime2){
var res = dateTime1 != null && dateTime2 != null
return () => res;
}
Более того, если вы хотите отфильтровать IQueryable (ср.), что вам нужно сделать, если вы, например. хотите, чтобы база данных выполняла фильтрацию, которую вам нужно вернуть Expression<Func<bool>>
:
private static Expression<Func<bool>> AreNotNull(DateTime? dateTime1, DateTime? dateTime2)
=> () => dateTime1 != null && dateTime2 != null;
Нет, если вам это нужно для EF, вам нужно вернуть выражение, например
Expression<Func<...>>
.