如何在 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 【问题描述】:如果我有一个 Linq
到 SQL
这样的表达式:
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()?的主要内容,如果未能解决你的问题,请参考以下文章