У меня возникло исключение при выполнении следующих утверждений.
DateTime result;
if (!DateTime.TryParse(rule.data, out result))
return jobdescriptions;
if (result < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753
return jobdescriptions;
return jobdescriptions.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );
Исключение
The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
Я знаю, что означает исключение, но не знаю, как от него избавиться. Любая помощь?
entity-framework
linq-to-entities
туманность
источник
источник
.Date
.Ответы:
LINQ to Entities не может транслировать большинство методов .NET Date (включая используемое приведение) в SQL, поскольку не существует эквивалентного SQL.
Решение состоит в том, чтобы использовать методы Date вне оператора LINQ, а затем передать значение. Похоже, что Convert.ToDateTime (rule.data) .Date вызывает ошибку.
Дата вызова свойства DateTime также не может быть преобразована в SQL, поэтому обходной путь заключается в сравнении свойств .Year .Month и .Day, которые можно преобразовать в LINQ, поскольку они являются только целыми числами.
источник
j.JobDeadline.Date
?Вы можете использовать метод TruncateTime EntityFunctions, чтобы добиться правильного перевода
Date
свойства в SQL:Обновление:
EntityFunctions
устарело в EF6, используйтеDbFunctions.TruncateTime
источник
ruleData
этоDateTime
тип иj.JobDeadline
усеченное время. Не кажется правильным. Не было исключения, но и ожидаемого результата не было.JobDeadline
с той же датой, что иrule.data
, независимо от времени суток . Разве это не то, чего вы хотите достичь с помощью вашего вопроса в вопросе? Почему это не так?EntityFunctions
в EF6 это не рекомендуется, теперь вы должны использоватьDbFunctions
.System.Data.Entity
: msdn.microsoft.com/en-us/library/Dn220142(v=VS.113).aspxДля EF6 используйте вместо этого DbFunctions.TruncateTime (mydate).
источник
«EntityFunctions.TruncateTime» или «DbFunctions.TruncateTime» в ef6 работает, но у него есть проблемы с производительностью в больших данных.
Я думаю, что лучше всего поступить так:
это лучше, чем использовать части даты до. потому что запрос выполняется быстрее в больших данных.
источник
EntityFunctions.TruncateTime
(позже заменены наDbFunctions.TruncateTime
) реализуются путем преобразования в SQL, где datetime преобразуется в строку и усекается. Это значительно замедляет выполнение запроса пропорционально количеству обработанных записей.Нужно включить
using System.Data.Entity;
. Хорошо работает даже сProjectTo<>
источник
Это означает, что LINQ to SQL не знает, как
Date
преобразовать свойство в выражение SQL. Это связано с тем, чтоDate
свойствоDateTime
структуры не имеет аналога в SQL.источник
У меня это сработало.
Источник: Форумы Asp.net
источник
У меня такая же проблема, но я работаю с DateTime-Ranges. Мое решение - настроить время начала (с любой датой) на 00:00:00 и время окончания на 23:59:59. Так что мне больше не нужно преобразовывать DateTime в Date, вместо этого он остается DateTime.
Если у вас есть только один DateTime, вы также можете установить время начала (с любой датой) на 00:00:00 и время окончания на 23:59:59. Затем вы выполняете поиск, как если бы это был промежуток времени.
Вы также можете сделать это с помощью DateTime-Range:
источник
вы можете получить Enum как:
источник
Как здесь многие отмечали, использование функции TruncateTime происходит медленно.
Самый простой вариант - использовать EF Core. Он может это сделать. Если вы не можете, то лучшей альтернативой усечению будет вообще не изменять запрашиваемое поле, а изменять границы. Если вы выполняете обычный запрос типа «между», в котором нижняя и верхняя границы не являются обязательными, следующее поможет.
По сути, вместо того, чтобы обрезать PoDate только до части Date, мы увеличиваем верхнюю границу запроса и user <вместо <=
источник