TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);
// first get today's sleeping hours
List<Model.Sleep> sleeps = context.Sleeps.Where(
o => (clientDateTime - o.ClientDateTimeStamp < time24) &&
o.ClientDateTimeStamp.TimeOfDay > time18 &&
clientDateTime.TimeOfDay < time18 &&
o.UserID == userid).ToList();
Это выражение Linq вызывает исключение:
DbArithmeticExpression arguments must have a numeric common type.
Пожалуйста помоги!
c#
entity-framework
ado.net
Наваз Дхандала
источник
источник
clientDateTime - o.ClientDateTimeStamp
?Ответы:
Арифметика с
DateTime
не поддерживается в Entity Framework 6 и более ранних версиях. Вы должны использовать DbFunctions *. Итак, для первой части вашего утверждения что-то вроде:Обратите внимание, что
DiffHours
метод принимаетNullable<DateTime>
.Ядро Entity Framwork (при использовании с Sql Server, возможно, другими поставщиками db) поддерживает
AddXxx
функции DateTime (напримерAddHours
). Они переведены наDATEADD
SQL.*
EntityFunctions
до Entity Framework версии 6.источник
Я знаю, что это старый вопрос, но в вашем конкретном случае вместо использования,
DBFunctions
предложенного @GertArnold, не могли бы вы просто инвертировать операцию, чтобы удалить рассматриваемую арифметику из Lambda?В конце концов,
clientDateTime
иtime24
являются фиксированными значениями, поэтому их разницу не нужно пересчитывать на каждой итерации.Подобно:
Этот рефакторинг обычно возможен, если вы пытаетесь сравнить сохраненную дату и время, сдвинутую на временную метку исправления, с другой датой и временем.
источник
В противном случае, если производительность не является истинной целью, вы можете попробовать использовать
AsEnumerable()
. Итак, это было бы какДобавление AsEnumerable () преобразует запрос SQL в сущность и позволяет запускать на них функции .Net. Для получения дополнительной информации проверьте здесь AsEnumerable
источник