使用实体框架按时间戳列选择新记录

Posted

技术标签:

【中文标题】使用实体框架按时间戳列选择新记录【英文标题】:Select new records by timestamp column with Entity Framework 【发布时间】:2013-07-19 15:01:29 【问题描述】:

我的 SQL Server 数据库中有一个带有时间戳列 (RowId) 的表。

我想根据这个时间戳查询新行。 SQL 查询如下

SELECT *
 FROM [MyTable]
 where RowId>=0x0000000000A99B06

0x0000000000A99B06 是上一个查询的最大时间戳值。

如何首先使用 Entity Framework 数据库进行这样的查询? RowId 映射到 byte[] 属性,我不知道如何在 LINQ 查询中比较字节数组。

【问题讨论】:

【参考方案1】:

其实你可以做一些小技巧。它对我有用 100%

internal static class EntityFrameworkHelper

   public static int Compare(this byte[] b1, byte[] b2)
   
      throw new NotImplementedException();
     

然后你可以像这样使用它:

public void SomeMethod()

   var messages = Set<Message>().Where(m => m.Modified.Compare(filter.TimeStamp) > 0).ToList();

它最终会生成这样的 SQL 语法:“Select * from Messages Where Modified > @param)。它可以工作。永远不会抛出异常。

【讨论】:

这是解决此问题的绝佳方法。如果有人需要,还有另一个更复杂的解决方案可以创建通用版本:***.com/a/38152016/2645243 我们的代码库中有同样的 hack。我不知道为什么 EF 没有开箱即用地做正确的事情。【参考方案2】:

您不能使用 Entity Framework 执行此操作,因为它不允许在时间戳比较中使用 &gt;= 运算符。它只允许=。你可以这样做,例如

var b = BitConverter.GetBytes(1000000L);
var query = from x in MyTable
            where x.RowId = b; // not >=

但这不会很有用。因此,您必须找到另一种获取新行的方法,例如标识列中的值,或添加“真实”时间戳(日期时间)列。

【讨论】:

谢谢。一般来说,我可以通过以下方式做到这一点:(from x in MyTable where x.Id > (from k in MyTable where k.ROWID == b select k.Id).First() select x);【参考方案3】:

另一种方法是使用纯 SQL 和 EntityFramework。

它可以避免额外的内部查询(参见 Gert Arnold 的回答和我的评论),但它看起来很丑。

long timeStamp = 100500;
IEnumerable<MyTable> result = context.Database.SqlQuery<MyTable>(String.Format("SELECT * FROM MyTable WHERE ROWID>0 ORDER BY RowId ASC", timeStamp));

【讨论】:

以上是关于使用实体框架按时间戳列选择新记录的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:有效地使用where子句过滤时间戳列以获取特定日期的所有记录

在时间戳列上为使用年份函数的查询创建索引

实体框架时间戳生成数据库问题

从纪元时间戳列中仅检索具有今天日期的记录

按查询对时间戳列排序非常慢

如何从 H2 中的时间戳列中提取日期