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

Posted

技术标签:

【中文标题】如何在 Linq to SQL 表达式中使用 SQL 的 GETDATE() 和 DATEADD()?【英文标题】:How do I use SQL's GETDATE() and DATEADD() in a Linq to SQL expression? 【发布时间】:2008-10-14 10:11:45 【问题描述】:

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

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

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

下一个问题是如何翻译:

DateTime.Now.AddDays(2)

到这里:

DATEADD(dd, 2, GETDATE())

【问题讨论】:

【参考方案1】:

试试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 函数。

【讨论】:

注意:这被直接翻译成 GETDATE() 函数,例如没有单独调用 SQL Server。刚刚验证过了。 天才!很好的解决方案,非常感谢。 MethodInfo 是 System.Reflection.MethodInfo,Function 是 System.Data.Linq.Mapping.Function 我看不出日期差异方法如何取代 DATEADD()。 DATEADD() 根据指定的差异返回日期,但 System.Data.Linq.SqlClient 命名空间中列出的日期差异方法仅返回日期之间的差异,在这种情况下用户已经知道。 msdn.microsoft.com/en-us/library/…【参考方案2】:

如果您不介意在每次使用前查询数据库,我建议以下解决方法:在一个地方使用 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

【讨论】:

【参考方案3】:

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

我知道它似乎与 ADO.NET 相比几乎没有什么好处(或者可能相反)。

【讨论】:

嗯...那么它不是 LINQ 表达式 ;-) true :) 但是如果 linq2sql 应该是对 sql 的抽象,那么您一开始就不应该使用 sql 函数吗? :P

以上是关于如何在 Linq to SQL 表达式中使用 SQL 的 GETDATE() 和 DATEADD()?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ TO SQL

关于Linq to Sql的分页

LINQ to nHibernate - 将 SQL“NOT IN”表达式转换为 LINQ

通配符搜索LINQ to SQL

如何使用存储过程在 LINQ to SQL 中使用事务?

如何使用方法语法在 linq to sql 中进行连接?