2012-04-05 91 views
8

que tienen la estructura de datosLINQ para seleccionar últimos registros

enter image description here

Para cada elemento hay un registro de su precio en una fecha determinada en cada moneda. Necesito crear una consulta que devuelva el precio más actual para cada moneda.

Esta consulta funciona, pero devuelve varios Amounts para la identificación de moneda 1. Solo debe devolver 3 registros, 7,8 and 9, ya que representan los precios más actualizados en todas las monedas para este artículo.

var q = (from c in db.tblStoreItemPrices where c.ItemID == ID select new { c.CurrencyID, c.Amount }); 

Ignore todos los pedidos y suponga que los registros se ordenan aleatoriamente.

¡Gracias por cualquier ayuda!

+0

"asume que los registros se ordenan aleatoriamente" ¿No tendría más sentido tener un índice agrupado que no sea la clave principal con el fin de reducir este random'ness para un rendimiento solo. – KingCronus

Respuesta

27

Esto debería funcionar:

db.tblStoreItemPrices 
    .Where(c => c.ItemID == ID) 
    .GroupBy(c => c.CurrencyID) 
    .Select(g => g.OrderByDescending(c => c.Date).First()) 
    .Select(c => new { c.CurrencyID, c.Amount }); 

Explicación:

  1. seleccionar las filas de la específica ItemID
  2. Grupo de currencyID
  3. desde dentro de cada grupo de divisas seleccionar la fila que tiene el mayor fecha reciente (dejando una fila para cada CurrencyID en el conjunto de resultados)
  4. Pull out th e información que desea de estas filas
+1

Gracias, fue una gran ayuda. En ASP.NET MVC 5 fue solo un problema con First: después de cambiar a FirstOrDefault funcionó muy bien. Gracias de nuevo :) – Tunerx

+0

en lugar de orderByDescending basado en la fecha, haga orderByDescending en id, porque id probablemente indexado y asociado con los últimos datos, por lo que la consulta será rápida. –

+0

pero la fecha de la columna Incase ya está indexada, entonces está bien –

Cuestiones relacionadas