Aquí podría ser tu PUBLICIDAD


¿Cómo puedo expresar de forma más elegante join left con SQL agregado como consulta LINQ?

votos
18

SQL:

SELECT
   u.id,
   u.name,
   isnull(MAX(h.dateCol), '1900-01-01') dateColWithDefault
FROM universe u
LEFT JOIN history h 
   ON u.id=h.id 
   AND h.dateCol<GETDATE()-1
GROUP BY u.Id, u.name
Publicado el 03/08/2008 a las 22:22
fuente por usuario vzczc
En otros idiomas...        العربية       

4 respuestas

votos
8

Una solución, aunque difiera el manejo del valor nulo del código, podría ser:

DateTime ayer = DateTime.Now.Date.AddDays (-1);

var collection=
    from u in db.Universe
    select new
    {
        u.id,
        u.name,
        MaxDate =(DateTime?)
       (
           from h in db.History
           where u.Id == h.Id
           && h.dateCol < yesterday
           select h.dateCol 
       ).Max()
    };

Esto no produce exactamente el mismo SQL, pero proporciona el mismo resultado lógico. Traducir consultas SQL "complejas" a LINQ no siempre es sencillo.

Respondida el 03/08/2008 a las 10:31
fuente por usuario vzczc


Aquí podría ser tu PUBLICIDAD


votos
1
var collection=
    from u in db.Universe
    select new
    {
        u.id,
        u.name,
        MaxDate =(DateTime?)
       (
           from h in db.History
           where u.Id == h.Id
           && h.dateCol < yesterday
           select h.dateCol 
       ).Max()
    };

Sólo youse el código anterior y esto debería funcionar bien!

Respondida el 18/04/2016 a las 09:16
fuente por usuario user6219686

votos
0

Querrá usar el join intoconstructo para crear una consulta grupal.

TestContext db = new TestContext(CreateSparqlTripleStore());
var q = from a in db.Album
        join t in db.Track on a.Name equals t.AlbumName into tracks
        select new Album{Name = a.Name, Tracks = tracks};
foreach(var album in q){
    Console.WriteLine(album.Name);
    foreach (Track track in album.Tracks)
    {
        Console.WriteLine(track.Title);
    }
}
Respondida el 17/09/2008 a las 06:28
fuente por usuario Orion Adrian

votos
0

Esta no es una respuesta completa para usted, pero en la pieza de combinación izquierda puede usar el operador DefaultIfEmpty de la siguiente manera:

var collection = 
from u in db.Universe
join history in db.History on u.id = history.id into temp
from h in temp.DefaultIfEmpty()
where h.dateCol < DateTime.Now.Date.AddDays(-1)
select u.id, u.name, h.dateCol ?? '1900-01-01'

No he tenido la necesidad de hacer ningún comando groupby todavía, así que dejé eso para no enviarte por el camino equivocado. Otras dos cosas rápidas para tener en cuenta. No he podido unirme realmente a dos parámetros, aunque como se indicó anteriormente, hay formas de evitarlo. También el ?? el operador funciona muy bien en lugar del isnull en SQL.

Respondida el 28/08/2008 a las 08:09
fuente por usuario AdamB