2013-08-08 4 views
0

У меня есть простая веб-страница, используемая для ввода данных (построена с использованием .NET 4.5 и EF5). Каждый раз, когда пользователь обновляет запись, создается новая строка со значением TimeStamp, большим, чем предыдущая строка, которая была вставлена ​​(SQL Server гарантирует это).Выбор последней записи с использованием столбца TimeStamp

В БД исходные данные выглядят следующим образом. Короче говоря, данные означают, что TransactionNumber = 1 был добавлен один раз, а затем обновлен два раза.

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

Я хотел бы написать запрос 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

U может преобразовывать байты в UInt64: BitConverter.ToUInt64 (byteArray, 0), я не знаю, какой он тип, но не выглядит как double, если значения неверны, вы должны попробовать для изменения порядка байтов (Big and Little Endian) –

ответ

0

Вы можете получить номер транзакции с последним идентификатором транзакции, используя запрос ниже. Вы по-прежнему можете заказывать по столбцу Timestamp, даже если .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() 
} 

Затем вы можете выбрать оставшиеся столбцы, используя результат этого запроса.

+0

Hum. Это будет дорогой запрос. Я прыгал, и я мог сделать это за один проход. – Martin

+0

Я предполагаю, что может быть только один запрос, выполняемый над БД, если вы используете переменные IQueryable. Допустим, вы сохраняете результат моего запроса в переменной IQueryable x. Вы можете получить результат db.Transactions.Where (t => x.Any (group => group.TransactionId == t.TransactionId)). –

Смежные вопросы