2013-07-20 56 views
4

我在我的SQL Server数据库中有一个包含时间戳列(RowId)的表。使用实体框架按时间戳列选择新记录

我想根据此时间戳查询新行。在SQL查询以下

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

0x0000000000A99B06是从以前的查询最大时间戳值。

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

回答

1

你不能在Entity Framework中这样做,因为它不允许在时间戳比较中使用>=运算符。它只允许=。你可以做例如

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

但这不会很有用。所以你必须找到另一种获得新行的方法,例如值标识列中,或者添加一个“实际”时间戳(日期时间)列。

+0

谢谢 一般情况下,我能做到这一点的方式如下:。 (从X在MyTable的 其中x.Id> (从K的MyTa ble 其中k.ROWID == b select k.Id).First() select x); –

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)); 
13

其实你可以做小黑客。它为我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语法:“从信息选择*如果修改> @参数)无数成功的例外是从来没有抛出

+0

这是此问题的绝佳解决方案。还有另一个更复杂的解决方案,可以在需要时创建此类的通用版本:http://stackoverflow.com/a/38152016/2645243 –

+0

我们在代码库中也有同样的问题。我不知道为什么EF不开箱即可做正确的事情。 – Nelson