right mvc multiple left c# linq left-join

c# - mvc - multiple left join linq



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

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.

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


Querrá usar la join into construir para crear una consulta de grupo.

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); } }


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.


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() };

Simplemente use el código anterior y ¡esto debería funcionar bien!