2009-01-22 18 views
90

Tengo una tabla, 'lasttraces', con los siguientes campos.Cómo seleccionar solo los registros con la fecha más alta en LINQ

Id, AccountId, Version, DownloadNo, Date 

Los datos se parece a esto:

28092|15240000|1.0.7.1782|2009040004731|2009-01-20 13:10:22.000 
28094|61615000|1.0.7.1782|2009040007696|2009-01-20 13:11:38.000 
28095|95317000|1.0.7.1782|2009040007695|2009-01-20 13:10:18.000 
28101|15240000|1.0.7.1782|2009040004740|2009-01-20 14:10:22.000 
28103|61615000|1.0.7.1782|2009040007690|2009-01-20 14:11:38.000 
28104|95317000|1.0.7.1782|2009040007710|2009-01-20 14:10:18.000 

¿Cómo puedo, en LINQ to SQL, sólo recibe el último lasttrace de cada AccountId (el que tiene la fecha más alto)?

+0

en su ejemplo, todos los registros con el mismo ID de cuenta tienen exactamente la misma fecha, entonces, ¿cuál de ellos prefiere en ese caso? – BlackTigerX

Respuesta

188

Si lo que desea es la última fecha para cada cuenta, tendrá que utilizar esto:

var q = from n in table 
     group n by n.AccountId into g 
     select new {AccountId = g.Key, Date = g.Max(t=>t.Date)}; 

Si desea todo el disco:

var q = from n in table 
     group n by n.AccountId into g 
     select g.OrderByDescending(t=>t.Date).FirstOrDefault(); 
+0

hhaa. Usted fue más rápido;) –

+2

Oracle no es compatible con esto. Si el rendimiento de la consulta está fuera de su consideración, puede convertir la tabla ToList antes de realizar la consulta. –

+4

Sería genial si puede publicar una solución 'method-chain' para esto. – Lijo

4

Podría ser algo como:

var qry = from t in db.Lasttraces 
      group t by t.AccountId into g 
      orderby t.Date 
      select new { g.AccountId, Date = g.Max(e => e.Date) }; 
3

Vaya a una manera simple de hacer esto: -

creado una clase para contener la información siguiente Nivel

  • (número)
  • URL (URL del sitio)

Ir la lista de sitios almacenados en un objeto ArrayList. Y se ejecuta la siguiente consulta para ordenarlo en orden descendente por nivel.

var query = from MyClass object in objCollection 
    orderby object.Level descending 
    select object 

Una vez que llegué la colección en orden descendente, escribí siguiente código para obtener el objeto que se presenta como la fila superior

MyClass topObject = query.FirstRow<MyClass>() 

Esto funcionó como encanto.

+0

Esto me dio una idea mejor que mi pensamiento original. ¡Gracias! – Paulj

31

Aquí es una forma sencilla de hacerlo

var lastPlayerControlCommand = this.ObjectContext.PlayerControlCommands 
           .Where(c => c.PlayerID == player.ID) 
           .OrderByDescending(t=>t.CreationTime) 
           .FirstOrDefault(); 

También eche un vistazo este gran lugar LINQ - LINQ to SQL Samples

+1

+1 para una buena solución. – Sheridan

+12

Esta solución funciona bien si consultas por cuenta pero no hace lo que OP declaró, que es obtener el resultado más reciente para todos los registros sin proporcionar un AccountId (en tu caso PlayerId) – Maciej

+0

Esta solución me inspiró para ordenar en su lugar probar para seleccionar el máximo. +1 –

9

Si desea todo el disco, aquí es una forma lambda:

var q = _context 
      .lasttraces 
      .GroupBy(s => s.AccountId) 
      .Select(s => s.OrderByDescending(x => x.Date).FirstOrDefault()); 
Cuestiones relacionadas