【问题标题】:Selecting the most recent entry using TimeStamp column [duplicate]使用时间戳列选择最近的条目[重复]
【发布时间】:2013-08-10 18:11:23
【问题描述】:

我有一个用于数据输入的简单网页(使用 .NET 4.5 和 EF5 构建)。每次用户更新条目时,都会创建一个新行,其时间戳值大于插入的前一行(SQL Server 保证这一点)。

在数据库中,原始数据如下所示。简而言之,数据意味着 TransactionNumber = 1 被添加一次,然后被更新两次。

+---------------+-------------------+-----------+--------------------+
| TransactionId | TransactionNumber |  Comment  |     TimeStamp      |
+---------------+-------------------+-----------+--------------------+
|             1 |                 1 | Bla       | 0x00000000000007D1 |
|             2 |                 1 | BlaBla    | 0x00000000000007D2 |
|             3 |                 1 | BlaBlaBla | 0x00000000000007D3 |
|             4 |                 2 | Hello     | 0x00000000000007D4 |
+---------------+-------------------+-----------+--------------------+

我想编写一个 Linq 查询,它只获取每个 TransactionNumber 的最新值。考虑到上面的数据,我的查询将返回以下结果。

+---------------+-------------------+-----------+--------------------+
| TransactionId | TransactionNumber |  Comment  |     TimeStamp      |
+---------------+-------------------+-----------+--------------------+
|             3 |                 1 | BlaBlaBla | 0x00000000000007D3 |
|             4 |                 2 | Hello     | 0x00000000000007D4 |
+---------------+-------------------+-----------+--------------------+

到目前为止,我面临的最大问题是 TimeStamp 列的类型为 byte[],我不确定如何进行字节比较。知道怎么做吗?

public class Transaction
{
    // ...

    [Timestamp]
    public Byte[] TimeStamp { get; set; }
}

【问题讨论】:

  • U 可以将字节转换为 UInt64:BitConverter.ToUInt64(byteArray, 0),我不知道它是什么类型,但如果值不是,它看起来不像双精度正确,您应该尝试重新排序字节(Big and Little Endian)

标签: c# .net entity-framework entity-framework-5


【解决方案1】:

您可以使用下面的查询获取具有最新交易 ID 的交易编号。即使 .NET 替代品是 byte[],您仍然可以按时间戳列排序。

from transaction in db.Transactions
group transaction by transaction.TransactionNumber into g
select new
{
    TransactionNumber = g.Key,
    TransactionId = g.OrderByDescending(t => t.TimeStamp).Select(t => t.TransactionId).FirstOrDefault()
}

然后,您可以使用此查询的结果选择剩余的列。

【讨论】:

  • 哼。这将是一个昂贵的查询。我想我可以一口气完成。
  • 我猜只要您使用 IQueryable 变量,就只能在 DB 上执行一个查询。假设您将我的查询结果存储在变量 IQueryable x 中。您可以通过 db.Transactions.Where(t => x.Any(group => group.TransactionId == t.TransactionId)) 获得结果。
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 2015-03-14
  • 2017-03-19
  • 1970-01-01
  • 2021-09-05
  • 2014-12-20
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多