如何在Linq to SQL表达式中使用SQL的GETDATE()和DATEADD()?

时间:2008-10-14 10:11:46

标签: sql linq-to-sql

如果我有LinqSQL这样的表达式:

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

我希望这能使用SQL Server GETDATE()函数,而不是机器运行C#程序的时间。

接下来的问题是如何翻译这个:

DateTime.Now.AddDays(2)

到此:

DATEADD(dd, 2, GETDATE())

3 个答案:

答案 0 :(得分:43)

尝试this

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

编辑:这需要成为您的DataContext类的一部分。

现在,您可以在查询中使用GetSystemDate()而不是DateTime.Now。 至于日期差异,请查看System.Data.Linq.SqlClient命名空间,尤其是SqlMethods类的DayDiffXXX函数。

答案 1 :(得分:6)

如果你不介意在每次使用之前查询数据库,我建议采用以下解决方法:在一个地方使用ExecuteQuery来获取数据上下文中的日期:

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

然后你可以写

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

答案 2 :(得分:0)

您可以使用ExecuteQuery来完全控制sql http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx

我知道这似乎与ADO.NET相比没什么好处(或者可能是对比)。