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!