当前位置:  开发笔记 > 编程语言 > 正文

查询从LINQ到SQL的时间戳列

如何解决《查询从LINQ到SQL的时间戳列》经验,为你挑选了2个好方法。

我的表有一个名为"RowVer"的时间戳列,LINQ映射到System.Data.Linq.Binary类型.这种数据类型对我来说似乎没用,因为(除非我遗漏了什么)我不能做这样的事情:

// Select all records that changed since the last time we inserted/updated.
IEnumerable rows = db.UserSessions.Where
( usr => usr.RowVer > ???? );

所以,我正在寻找的解决方案之一是添加一个名为RowTrack的新"计算列",它在SQL中定义如下:

CREATE TABLE UserSession
(
RowVer timestamp NOT NULL,
RowTrack  AS (convert(bigint,[RowVer])),
-- ... other columns ...
)

这允许我像我想要的那样查询数据库:

// Select all records that changed since the last time we inserted/updated.
IEnumerable rows = db.UserSessions.Where
( usr => usr.RowTrack > 123456 );

这是一个糟糕的做事方式吗?查询计算列的性能如何?有更好的解决方法吗?

此外,我正在开发针对Sql Server 2000的最终向后兼容性,但我可以与老板谈论使2005年成为最低的共同点.



1> jaraics..:

AS Diego Frata在这篇文章中概述了一个hack,它使得时间戳可以从LINQ中查询.

诀窍是定义一个带有两个System.Data.Linq.Binary参数的Compare方法

public static class BinaryComparer
{
 public static int Compare(this Binary b1, Binary b2)
 {
 throw new NotImplementedException();
 }
}

请注意,该功能不需要实现,只有它的名称(比较)很重要.

查询将类似于:

Binary lastTimestamp = GetTimeStamp();
var result = from job in c.GetTable
             where BinaryComparer.Compare(job.TimeStamp, lastTimestamp)>0
             select job;

(这是在job.TimeStamp> lastTimestamp的情况下)

编辑:如果您需要在SQL之外工作,请参阅Rory MacLeod对该方法实现的回答.



2> Kristen..:

SQL Server"timestamp"只是记录已更改的指示符,它实际上并不表示日期/时间.(虽然每次修改DB中的记录时都会增加,

请注意它将回绕到零(不经常,不可否认),因此唯一安全的测试是,如果值已更改,而不是大于某个任意先前值.

您可以将TimeStamp列值传递给Web表单,然后在提交时查看表单中的TimeStamp是否与当前记录中的值不同 - 如果它不同,则其他人已更改并在临时中保存记录.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有