Аргументы DbArithmeticExpression должны иметь числовой общий тип
TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);
// first get today 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.
Пожалуйста, помогите!
Ответы
Ответ 1
Арифметика с DateTime
не поддерживается в Entity Framework 6 и ранее. Вы должны использовать DbFunctions *. Итак, для первой части вашего утверждения, что-то вроде:
var sleeps = context.Sleeps(o =>
DbFunctions.DiffHours(o.ClientDateTimeStamp, clientDateTime) < 24);
Обратите внимание, что метод DiffHours
принимает Nullable<DateTime>
.
Ядро фреймворка Entity (при использовании с Sql Server, возможно, другие поставщики db) поддерживает функции DateTime AddXxx
(например, AddHours
). Они переведены в DATEADD
в SQL.
* EntityFunctions
до версии Entity Framework версии 6.
Ответ 2
Я знаю, что это старый вопрос, но в вашем конкретном случае вместо использования DBFunctions
, как было предложено @GertArnold, разве вы не могли бы просто инвертировать операцию переместить арифметику, о которой идет речь, из Lambda?
В конце концов clientDateTime
и time24
являются фиксированными значениями, поэтому их разность не требуется пересчитывать на каждой итерации.
Как
TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);
var clientdtminus24 = clientDateTime - time24;
// first get today sleeping hours
List<Model.Sleep> sleeps = context.Sleeps.Where(
o => (clientdtminus24 < o.ClientDateTimeStamp) &&
o.ClientDateTimeStamp.TimeOfDay > time18 &&
clientDateTime.TimeOfDay < time18 &&
o.UserID == userid).ToList();
Этот рефактор, как правило, возможен, если вы пытаетесь сравнить хранимое время datetime, сдвинутое по временной отметке с другим дат-временем.