Recebi uma exceção ao implementar as seguintes instruções.
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 );
Exceção
The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
Eu sei o que significa a exceção, mas não sei como me livrar dela. Qualquer ajuda?
entity-framework
linq-to-entities
nebulosa
fonte
fonte
.Date
.Respostas:
LINQ to Entities não pode converter a maioria dos métodos .NET Date (incluindo a conversão usada) em SQL, pois não há SQL equivalente.
A solução é usar os métodos Date fora da instrução LINQ e, em seguida, passar um valor. Parece que Convert.ToDateTime (rule.data) .Date está causando o erro.
Chamar Date em uma propriedade DateTime também não pode ser convertido em SQL, portanto, uma solução alternativa é comparar as propriedades .Year .Month e .Day que podem ser convertidas para LINQ, pois são apenas inteiros.
fonte
j.JobDeadline.Date
?Você pode usar o método TruncateTime de EntityFunctions para obter uma tradução correta da
Date
propriedade em SQL:Update:
EntityFunctions
está obsoleto no EF6, UseDbFunctions.TruncateTime
fonte
ruleData
éDateTime
tipo ej.JobDeadline
truncou o tempo. Não parece certo. Não obteve exceção, mas também não obteve o resultado esperado.JobDeadline
tenham a mesma data querule.data
, não importando a hora do dia . Não é isso que você deseja alcançar com sua consulta na pergunta? Por que não parece certo?EntityFunctions
está obsoleto no EF6, você deve usar agoraDbFunctions
.System.Data.Entity
: msdn.microsoft.com/en-us/library/Dn220142(v=VS.113).aspxPara EF6, use DbFunctions.TruncateTime (mydate).
fonte
"EntityFunctions.TruncateTime" ou "DbFunctions.TruncateTime" no ef6 está funcionando, mas há alguns problemas de desempenho no Big Data.
Acho que a melhor maneira é agir assim:
é melhor do que usar partes da data para. porque a consulta é executada mais rapidamente em dados grandes.
fonte
EntityFunctions.TruncateTime
(posteriormente substituídos porDbFunctions.TruncateTime
) são implementados pela conversão para SQL, onde a data e hora é convertida em uma string e é truncada. Isso torna a execução da consulta significativamente mais lenta, em proporção ao número de registros processados.Precisa incluir
using System.Data.Entity;
. Funciona bem mesmo comProjectTo<>
fonte
O que isso significa é que LINQ to SQL não sabe como transformar a
Date
propriedade em uma expressão SQL. Isso ocorre porque aDate
propriedade daDateTime
estrutura não tem analogia no SQL.fonte
Funcionou para mim
Fonte: Fóruns Asp.net
fonte
Eu tenho o mesmo problema, mas trabalho com DateTime-Ranges. Minha solução é manipular o horário de início (com qualquer data) para 00:00:00 e o horário de término para 23:59:59. Portanto, não devo mais converter meu DateTime para Date, mas ele permanece DateTime.
Se você tiver apenas um DateTime, também pode definir o horário de início (com qualquer data) para 00:00:00 e o horário de término para 23:59:59. Em seguida, você pesquisa como se fosse um intervalo de tempo.
Você também pode fazer isso com DateTime-Range:
fonte
você pode obter Enum como:
fonte
Como foi apontado por muitos aqui, o uso da função TruncateTime é lento.
A opção mais fácil, se possível, é usar o EF Core. Ele pode fazer isso. Se você não puder, uma alternativa melhor para truncar é não alterar o campo consultado, mas modificar os limites. Se você estiver fazendo uma consulta normal do tipo 'entre', em que os limites inferior e superior são opcionais, o seguinte fará o truque.
Basicamente, em vez de reduzir PoDate de volta para apenas a parte da data, incrementamos o limite superior da consulta e o usuário <em vez de <=
fonte