我的SQL Server数据库中有一个带有timestamp列(RowId
)的表。
我想根据此时间戳查询新行。 SQL查询如下:
SELECT *
FROM [MyTable]
where RowId>=0x0000000000A99B06
0x0000000000A99B06
是上一次查询的最大时间戳值。
如何使用Entity Framework数据库优先进行此类查询? RowId
映射到byte[]
属性,我不知道如何在LINQ查询中比较字节数组。
答案 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));