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();
Esta expressão Linq lança esta exceção:
DbArithmeticExpression arguments must have a numeric common type.
Por favor ajude!
c#
entity-framework
ado.net
Nawaz Dhandala
fonte
fonte
clientDateTime - o.ClientDateTimeStamp
?Respostas:
Aritmética com
DateTime
não é compatível com o Entity Framework 6 e anteriores. Você deve usar DbFunctions *. Então, para a primeira parte de sua declaração, algo como:Observe que o
DiffHours
método aceitaNullable<DateTime>
.O núcleo do Entity Framwork (quando usado com o Sql Server, talvez outros provedores de banco de dados) suporta as
AddXxx
funções DateTime (comoAddHours
). Eles são traduzidos paraDATEADD
em SQL.*
EntityFunctions
antes do Entity Framework versão 6.fonte
Eu sei que esta é uma questão antiga, mas no seu caso específico, em vez de usar
DBFunctions
como sugerido por @GertArnold, você não poderia simplesmente inverter a operação e retirar a aritmética em questão do Lambda?Afinal,
clientDateTime
etime24
são valores fixos para que sua diferença não precise ser recalculada a cada iteração.Gostar:
Essa refatoração geralmente é possível se você estiver tentando comparar a data e hora armazenada alterada por um carimbo de data / hora fixo com uma outra data e hora.
fonte
Por outro lado, se o desempenho não for o verdadeiro objetivo, você pode tentar usar
AsEnumerable()
. Então, seria comoAdicionar AsEnumerable () converterá a consulta SQL em entidade e permitirá executar funções .Net nelas. Para obter mais informações, verifique aqui sobre AsEnumerable
fonte