RowId
我的SQL Server 数据库中有一个带有时间戳列 ( ) 的表。
我想根据这个时间戳查询新行。SQL查询如下
SELECT *
FROM [MyTable]
where RowId>=0x0000000000A99B06
0x0000000000A99B06
是上一个查询的最大时间戳值。
如何使用 Entity Framework 数据库优先进行这样的查询?RowId
映射到byte[]
属性,我不知道如何比较 LINQ 查询中的字节数组。
RowId
我的SQL Server 数据库中有一个带有时间戳列 ( ) 的表。
我想根据这个时间戳查询新行。SQL查询如下
SELECT *
FROM [MyTable]
where RowId>=0x0000000000A99B06
0x0000000000A99B06
是上一个查询的最大时间戳值。
如何使用 Entity Framework 数据库优先进行这样的查询?RowId
映射到byte[]
属性,我不知道如何比较 LINQ 查询中的字节数组。
实际上你可以做一些小技巧。它对我有用 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)。它可以工作。永远不会抛出异常。
另一种方法是使用带有 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));
您不能使用 Entity Framework 执行此操作,因为它不允许>=
在时间戳比较中使用运算符。它只允许=
. 你可以做例如
var b = BitConverter.GetBytes(1000000L);
var query = from x in MyTable
where x.RowId = b; // not >=
但这不会很有用。因此,您必须找到另一种获取新行的方法,例如标识列中的值,或者添加“真实”时间戳(日期时间)列。