En mi aplicación estoy usando Entity Framework.
Mi mesa
-Article
-period
-startDate
Necesito registros que coincidan => DateTime.Now > startDate and (startDate + period) > DateTime.Now
Probé este código pero ahora funciona
Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)
Cuando ejecuto mi código, ocurre la siguiente excepción
LINQ to Entities no reconoce el método 'System.DateTime AddDays (Double)', y este método no se puede traducir a una expresión de tienda.
c#
linq
entity-framework
datetime
Yucel
fuente
fuente
period
?AddDays
es la función incorrecta si es adouble
.Respuestas:
Al usar LINQ to Entity Framework, sus predicados dentro de la cláusula Where se traducen a SQL. Está recibiendo ese error porque no hay traducción a SQL, lo
DateTime.Add()
que tiene sentido.Una solución rápida sería leer los resultados de la primera instrucción Where en la memoria y luego usar LINQ to Objects para finalizar el filtrado:
También puede probar el método EntityFunctions.AddDays si está utilizando .NET 4.0:
Nota: En
EF 6
es ahoraSystem.Data.Entity.DbFunctions.AddDays
.fuente
Creo que esto es lo que la última respuesta estaba tratando de sugerir, pero en lugar de intentar agregar días a p.startdat (algo que no se puede convertir en una declaración SQL), ¿por qué no hacer algo que pueda equipararse a SQL?
fuente
EntityFunctions
solución. Aquí, el segundo operando no se recupera de otra entidad en la consulta y se puede calcular antes de la consulta. Si ambos operandos se encontraran en db, laEntityFunctions
solución aún sería adecuada mientras que la solución de esta respuesta ya no funcionaría.¿Qué tal restar 2 días de DateTime. Ahora:
Para ser honesto, no estoy seguro de lo que está tratando de lograr, pero esto puede funcionar.
fuente
Si necesita que su expresión se traduzca a SQL, puede intentar usar
Método System.Data.Entity.Core.Objects.AddDays.
En realidad está marcado como obsoleto pero funciona. Debería ser reemplazado por System.Data.Entity.DbFunctions.AddDays pero no puedo encontrarlo ...
fuente