使用Entity Framework按时间戳列选择新记录

时间:2013-07-20 10:12:28

标签: .net sql sql-server entity-framework timestamp

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

我想根据此时间戳查询新行。 SQL查询如下:

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

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

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

3 个答案:

答案 0 :(得分:16)

实际上你可以做小黑客。它适用于我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语法:“选择*来自修改后的消息&gt; @param。”并且它可以工作。永远不会抛出异常。

答案 1 :(得分:1)

您无法使用Entity Framework执行此操作,因为它不允许>=运算符进行时间戳比较。它只允许=。你可以这样做。

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

但这不会很有用。因此,您必须找到另一种获取新行的方法,例如:标识列中的值,或添加&#34; real&#34;时间戳(日期时间)栏。

答案 2 :(得分:1)

另一种方法是将纯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));