Аргументы DbArithmeticExpression должны иметь числовой общий тип

TimeSpan time24 = new TimeSpan(24, 0, 0); TimeSpan time18 = new TimeSpan(18, 0, 0); // first get today's sleeping hours List sleeps = context.Sleeps.Where( o => (clientDateTime - o.ClientDateTimeStamp  time18 && clientDateTime.TimeOfDay < time18 && o.UserID == userid).ToList(); 

Это выражение Linq генерирует это исключение:

 DbArithmeticExpression arguments must have a numeric common type. 

Пожалуйста помоги!

Арифметика с DateTime не поддерживается в Entity Framework 6 и ранее. Вы должны использовать DbFunctions *. Итак, для первой части вашего заявления, что-то вроде:

 var sleeps = context.Sleeps(o => DbFunctions.DiffHours(o.ClientDateTimeStamp, clientDateTime) < 24); 

Обратите внимание, что метод DiffHours принимает значение Nullable .

Ядро Entity Framwork (при использовании с Sql Server, возможно, другие поставщики db) поддерживает функции DateTime AddXxx (например, AddHours ). Они переведены в DATEADD в SQL.

* EntityFunctions до Entity Framework версии 6.

Я знаю, что это старый вопрос, но в вашем конкретном случае вместо использования 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's sleeping hours List sleeps = context.Sleeps.Where( o => (clientdtminus24 < o.ClientDateTimeStamp) && o.ClientDateTimeStamp.TimeOfDay > time18 && clientDateTime.TimeOfDay < time18 && o.UserID == userid).ToList(); 

Этот рефактор, как правило, возможен, если вы пытаетесь сравнить хранимое время, сдвинутое по временной отметке с другим дат-временем.

В противном случае, если производительность не является истинной целью, вы можете попробовать использовать AsEnumerable() . Таким образом, это было бы похоже на

 List sleeps = context.Sleeps.AsEnumerable().Where(.... 

Добавление AsEnumerable () преобразует SQL-запрос в объект и позволяет запускать на нем функции .Net. Для получения дополнительной информации, проверьте здесь, как AsEnumerable

  • Entity Framework Code First: настройка взаимной связи «один-на-один» с использованием аннотаций
  • Как сопоставить разбиение таблицы в EF Code First?
  • Сущность не может быть построена в запросе LINQ to Entities
  • Указанное именованное соединение либо не находится в конфигурации, не предназначено для использования с поставщиком EntityClient, либо недействительно
  • Шаблон хранилища, POCO и бизнес-объекты
  • Создание classа Entity для изменений
  • Сколько Include я могу использовать в ObjectSet в EntityFramework для сохранения производительности?
  • C # Entity-Framework: как я могу объединить .Find и .Include в объекте модели?
  • Как фильтровать вложенные объекты Entity Framework коллекции?
  • Вставка / обновление многих из многих структур Entity Framework. Как мне это сделать?
  • Идентификатор ASP.NET - несколько наборов объектов для каждого типа не поддерживаются
  • Давайте будем гением компьютера.