使用实体框架按时间戳列选择新记录
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 执行此操作,因为它不允许在时间戳比较中使用 >=
运算符。它只允许=
。你可以这样做,例如
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));
【讨论】:
以上是关于使用实体框架按时间戳列选择新记录的主要内容,如果未能解决你的问题,请参考以下文章