Разница в дате и времени в ядре Entity Framework

#entity-framework-core

#entity-framework-core

Вопрос:

У меня есть следующий запрос к ядру Entity Framework:

 public class Question {
  public DateTime? Approved { get; set; }
  public DateTime Created { get; set; }
}

public class QuestionModel {
  public TimeSpan ResponseTime { get; set; }
}

List<Question> questions = await context.Questions
  .Select(x =>
    new QuestionModel {
      ResponseTime = x.Approved.Value - x.Created
    }).ToListAsync();
 

Но я получаю следующую ошибку:

 System.Data.SqlClient.SqlException: Operand data type datetime2 is invalid for subtract operator.
 

Как я могу получить разницу в дате и времени с Entity Framework Core?

Ответ №1:

Вы также можете использовать этот метод расширения Subtract()

 List<Question> questions = (await context.Questions.ToListAsync())
.Select(x => new QuestionModel {
ResponseTime = x.Approved.Value.Subtract(x.Created);
})
.ToList();
 

Ответ №2:

System.Data.SqlClient.SQLException: Тип данных операнда datetime2 недопустим для оператора вычитания.

datetime2 Предположение, что он пытается перевести в SQL-оператор. Поэтому вы должны попытаться выполнить это в памяти (на стороне клиента, а не на стороне SQL Server).

 List<Question> questions = (await context.Questions.ToListAsync())
.Select(x =>
new QuestionModel {
  ResponseTime = x.Approved.Value - x.Created
}).ToList();
 

Вызывая ToListAsync() перед операцией выбора, вы принудительно выполняете запрос. Затем вы получаете все вопросы в памяти. Когда вы теперь выполните .Select над ним работу, он будет выполнен в памяти и не будет преобразован в SQL-запрос.