5

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

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

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

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

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

4

3 回答 3

17

实际上你可以做一些小技巧。它对我有用 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 语法:“从修改的消息中选择 * > @param)。它可以工作。永远不会抛出异常。

于 2013-10-16T11:47:46.137 回答
1

另一种方法是使用带有 EntityFramework 的普通 SQL。

它可以避免额外的内部查询(请参阅 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));
于 2013-07-22T07:43:12.723 回答
1

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

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

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

于 2013-07-21T09:22:33.767 回答