2008-10-14 11 views
26

Si tengo un Linq a SQL expresión como esta:¿Cómo utilizo GETDATE() y DATEADD() de SQL en una expresión de Linq a SQL?

from subscription in dbContext.Subscriptions 
where subscription.Expires > DateTime.Now 
select subscription 

Quiero que esto para utilizar la función de servidores SQL Server GETDATE() en lugar del tiempo de la máquina que ejecuta el programa de C#.

La siguiente pregunta sería cómo se traduce esto:

DateTime.Now.AddDays(2) 

a esto:

DATEADD(dd, 2, GETDATE()) 

Respuesta

43

Trate this:

[Function(Name="GetDate", IsComposable=true)] 
public DateTime GetSystemDate() 
{ 
    MethodInfo mi = MethodBase.GetCurrentMethod() as MethodInfo; 
    return (DateTime)this.ExecuteMethodCall(this, mi, new object[]{}).ReturnValue; 
} 

EDIT: esto debe ser parte de su clase DataContext.

Ahora puede usar GetSystemDate() en lugar de DateTime.Now en sus consultas. En cuanto a las diferencias de fecha, eche un vistazo al espacio de nombres System.Data.Linq.SqlClient, especialmente las funciones DayDiffXXX de la clase SqlMethods.

+1

Nota: esto se traduce directamente a la función GETDATE(), p. no hay llamadas separadas a SQL Server. Solo lo verifiqué. – liggett78

+0

Genius! Buena solución y muy apreciada. –

+1

MethodInfo es System.Reflection.MethodInfo y la función es System.Data.Linq.Mapping.Function – Trisped

6

Si no te importa la consulta de la base de datos antes de cada uso, sugeriría la siguiente solución: Uso ExecuteQuery en un solo lugar para obtener la fecha en el contexto de datos de esta manera:

public partial class YourDataContext 
{ 
    public DateTime GetDate() 
    { 
    return ExecuteQuery<DateTime>("SELECT GETDATE()").First(); 
    } 
} 

y, a continuación, puede escribir

from subscription in dbContext.Subscriptions 
where subscription > dbContext.GetDate().AddDays(2) 
select subscription 
Cuestiones relacionadas