如何在LINQ查询中使用SQL服务器时钟

本文关键字:SQL 服务器 时钟 LINQ 查询 | 更新日期: 2023-09-27 18:12:10

我正在编写一个具有"check in"功能的应用程序-本质上是一个系统托盘应用程序,通过写入SQL数据库每20秒检查一次。

然后我有第二个应用程序检查这个表,看看客户端是否已经登记,并执行一个操作,如果客户端没有登记60秒。

我需要确保写入sql数据库的时间是本地服务器时间,而不是客户端时间-否则我会有同步问题。

我正在使用Linq-to-SQL -我怎么能做到这一点?

如何在LINQ查询中使用SQL服务器时钟

实际上,根据一般经验,您也不应该使用服务器的本地时间,而应该使用UTC时间(协调世界时间)。

在Linq to Sql中,您可以使用SqlFunctions.GetUtcDate()来映射到Sql Server中的GETUTCDATE()

编写一个返回GetDate()的用户定义函数并将其添加到dbml文件

试试这个:

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

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

此解决方案适用于任何。net版本:它应该比其他解决方案更有利于速度和网络流量。

1)在SQL server中创建函数:
CREATE FUNCTION [dbo].[GetSQLServerDate] 
()
RETURNS datetime
AS
BEGIN
    DECLARE @Result datetime
    SELECT @Result = getdate()
    RETURN @Result
END
GO

2)将函数添加到LINQ to SQL图的存储过程部分

3)从代码中调用函数
THEDBDataContext DBConn = new THEDBDataContext ();
DateTime dt = (DateTime) DBConn.GetSQLServerDate();

Acaz Souza的答案有效,但它需要成为数据上下文的一部分。要将其置于特定数据上下文类之外(这可能更易于重用),请尝试将其作为扩展方法:

public static DateTime GetSystemDate(this DataContext db)
{
    return db.ExecuteQuery<DateTime>("SELECT GETDATE()").Single();
}