Vă mulțumim pentru susținere

Cum explic cel mai elegant aspectul de conectare la stânga cu SQL cumulat ca interogare LINQ

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
0
adăugat editat

3 răspunsuri

O soluție, deși una care îndepărtează manipularea valorii nula la cod, ar putea fi:

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

Aceasta nu produce exact același SQL, dar oferă același rezultat logic. Translatarea interogărilor SQL "complexe" la LINQ nu este întotdeauna simplă.

0
adăugat

Veți dori să utilizați constructorul join în pentru a crea o interogare de grup.

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);
    }
}
0
adăugat

Acest lucru nu este un răspuns complet pentru dvs., dar în partea stângă se poate utiliza operatorul DefaultIfEmpty cum ar fi:

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'

N-am avut niciodată nevoie să fac comenzi de grup, așa că am lăsat-o ca să nu vă trimit calea greșită. Două alte lucruri rapide de reținut. Nu am reușit să mă înscriu la doi parametri, deși așa cum am menționat mai sus există modalități de a ajunge în jur. De asemenea ?? operatorul funcționează foarte bine în loc de isnul în SQL.

0
adăugat