【问题标题】: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 查询中比较字节数组。

【问题讨论】:

    标签: .net sql sql-server entity-framework timestamp


    【解决方案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)。它可以工作。永远不会抛出异常。

    【讨论】:

    • 这是解决此问题的绝佳方法。如果有人需要,还有另一个更复杂的解决方案可以创建通用版本:stackoverflow.com/a/38152016/2645243
    • 我们的代码库中有同样的 hack。我不知道为什么 EF 没有开箱即用地做正确的事情。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      相关资源
      最近更新 更多