2009-08-04 16 views
14

Estoy escribiendo este código. Aquí se ingresa dt a la función, así como a someint. La columna Exp es una columna de fecha T-SQL, que viene como un DateTime a través de Linq.Cómo agregar el día a la fecha en Linq a SQL

return (from a in dataContext.TableOfA 
     where a.name == "Test" && 
     a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) 
     select a).First(); 

En C#, puede agregar un doble como un día a una fecha y hora. Lo que significa que puede agregar 1.5 días. En T-SQL solo puede agregar 1 día, luego 12 horas. Debe agregar un int para cada parte. Entonces, cuando Linq traduce AddDays a T-SQL, convierte mi número de días en milisegundos y los agrega. Esto le permite dar toda la precisión que el doble le da a C#.

Aquí está el problema. Cuando esto llega a SQL, obtengo el error:

The datepart millisecond is not supported by date function dateadd for data type date

Básicamente no puede agregar milisegundos a una fecha. Bueno, no es broma. ¿Pero cómo obtengo algo que se traduce aquí? Quiero agregar int días a una fecha. ¿Es el único querer hacer esto para agregar el negativo de ellos al otro tipo con el que estoy comparando? ¿Qué pasaría si quisiera comparar con columnas mientras agrego a una?

Actualización 1

Keith wrote, A command like datepart(millisecond, 10000, myDate) has been supported in T-SQL since at least SQL Server 2000. This error suggests that whatever database you are using does not support the millisecond date part, which seems strange to me.

Tenga en cuenta que estoy usando SQL Server 2008. No se admite el tipo de datos DATE. Es compatible con fecha y hora.

+0

Un comando como datepart (milisegundo, 10000, myDate) ha sido soportado en T-SQL desde al menos SQL Server 2000. Este error sugiere que cualquier base de datos que esté utilizando no admite la parte de la fecha milisegundo, lo que me parece extraño . – Keith

+0

No es compatible con el tipo de datos DATE. Es compatible con fecha y hora. –

+0

Eso tiene más sentido. Bien, si tiene control sobre el diseño de la BD, la solución simple sería cambiar esta columna de FECHA a FECHA. Obviamente, si estás haciendo esta pregunta, ¿no tienes control sobre esto? – Keith

Respuesta

4

Acabo de cambiar la columna a DateTime.

0

¿Ha considerado escribir su propia función definida por el usuario que básicamente toma un int (por número de días) y fecha, devuelve los resultados de una fechaadd()? Luego, inserte eso en la clase LINQ en su proyecto. Luego, en lugar de llamar a .AddDate(), llame a su UDF; esto le permitirá mantener todo en su consulta LINQ sin tener que compilar manualmente una SQLCommand.

6

Si está utilizando Entity Framework, utilice los System.Data.Objects.EntityFunctions de la siguiente manera:

c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1) 
3

puede mover la llamada a AddDays de la parte de SQL a la parte .NET:

a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint)) 
4

parece que este escenario se fija sobre todo en .NET 4.5.

Sin embargo, si escribe:

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.Date.AddDays(7) select p; 

obtendrá el mismo mensaje de error como se describe en el PO.

Pero, si escribe:

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.AddDays(7) select p; 

A continuación, puede entrar en la tierra de leche y miel. Tenga en cuenta que no invoqué .Date en la representación DateTime de la base de datos. Esto parece ser un caso extremo en el que falta la cobertura de prueba por el marco SQL de LINQ 2 en 4.5

+4

Estoy usando .NET 4.5.1 y ambos escenarios me dan el error "no soportado por LINQ" – mgrenier

3

Crear un nuevo DateTime objeto y utilizar AddDays método después de que:

new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx) 
-2

puede ser buena idea si usted primero cambiar la consulta SQL para LINQ y LINQ proceso de consulta en su lugar.

Sólo tiene que añadir ToList() o limitar registro

return (from a in dataContext.TableOfA.ToList() 
    where a.name == "Test" && 
    a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) 
    select a).First(); 

Así que una vez que tienes todas tus cosas en LINQ a continuación, puede procesar más effectivly creo.

Saludos

0

que puede utilizar: System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays) Esta función será traducido a consultas SQL válida. La clase System.Data.Entity.Core.Objects.EntityFunctions que también contiene la función AddDays está obsoleta.

Cuestiones relacionadas