我有一个用于数据输入的简单网页(使用.NET 4.5和EF5构建)。每次用户更新条目时,都会创建一个新行,其TimeStamp值大于插入的上一行(SQL Server保证)。
在DB中,原始数据如下所示。简而言之,数据意味着TransactionNumber = 1被添加一次然后更新两次。
+---------------+-------------------+-----------+--------------------+
| TransactionId | TransactionNumber | Comment | TimeStamp |
+---------------+-------------------+-----------+--------------------+
| 1 | 1 | Bla | 0x00000000000007D1 |
| 2 | 1 | BlaBla | 0x00000000000007D2 |
| 3 | 1 | BlaBlaBla | 0x00000000000007D3 |
| 4 | 2 | Hello | 0x00000000000007D4 |
+---------------+-------------------+-----------+--------------------+
我想编写一个只获取每个TransactionNumber的最新值的Linq查询。考虑到上面的数据,我的查询将返回以下结果。
+---------------+-------------------+-----------+--------------------+
| TransactionId | TransactionNumber | Comment | TimeStamp |
+---------------+-------------------+-----------+--------------------+
| 3 | 1 | BlaBlaBla | 0x00000000000007D3 |
| 4 | 2 | Hello | 0x00000000000007D4 |
+---------------+-------------------+-----------+--------------------+
到目前为止,我面临的最大问题是TimeStamp列的类型是byte [],我不知道如何对字节进行比较。知道怎么做吗?
public class Transaction
{
// ...
[Timestamp]
public Byte[] TimeStamp { get; set; }
}
答案 0 :(得分:0)
您可以使用下面的查询获取具有最新交易ID的交易号。即使.NET替代品为byte[]
,您仍然可以通过Timestamp列进行排序。
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()
}
然后,您可以使用此查询的结果选择剩余列。