#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-запрос.