Em meu aplicativo, estou usando o Entity Framework.
Minha mesa
-Article
-period
-startDate
Eu preciso de registros que correspondam a => DateTime.Now > startDate and (startDate + period) > DateTime.Now
Eu tentei este código, mas agora está funcionando
Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)
Quando eu executo meu código, ocorre a seguinte exceção
LINQ to Entities não reconhece o método 'System.DateTime AddDays (Double)' e esse método não pode ser convertido em uma expressão de armazenamento.
c#
linq
entity-framework
datetime
Yucel
fonte
fonte
period
?AddDays
é a função errada se for umdouble
.Respostas:
Ao usar LINQ to Entity Framework, seus predicados dentro da cláusula Where são traduzidos para SQL. Você está recebendo esse erro porque não há tradução para SQL
DateTime.Add()
que faça sentido.Uma solução rápida seria ler os resultados da primeira instrução Where na memória e, em seguida, usar LINQ to Objects para concluir a filtragem:
Você também pode tentar o método EntityFunctions.AddDays se estiver usando .NET 4.0:
Nota:
EF 6
está agoraSystem.Data.Entity.DbFunctions.AddDays
.fonte
Acho que é isso que a última resposta estava tentando sugerir, mas em vez de tentar adicionar dias a p.startdat (algo que não pode ser convertido em uma instrução sql), por que não fazer algo que pode ser igualado a sql:
fonte
EntityFunctions
solução. Aqui, o segundo operando não é recuperado de outra entidade na consulta e pode ser calculado antes da consulta. Se ambos os operandos fossem encontrados em db, aEntityFunctions
solução ainda seria adequada enquanto a solução desta resposta não funcionaria mais.Que tal subtrair 2 dias de DateTime.Now:
Para ser honesto, não tenho certeza do que você está tentando alcançar, mas isso pode funcionar
fonte
Se você precisa que sua expressão seja traduzida para SQL, você pode tentar usar
Método System.Data.Entity.Core.Objects.AddDays.
Na verdade, está marcado como obsoleto, mas funciona. Deve ser substituído por System.Data.Entity.DbFunctions.AddDays, mas não consigo encontrá-lo ...
fonte