c# - right - linq sql left join




Wie drücke ich am elegantesten linken Join mit aggregiertem SQL als LINQ-Abfrage aus? (3)

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

Dies ist keine vollständige Antwort für Sie, aber auf dem linken Join-Teil können Sie den DefaultIfEmpty -Operator wie folgt verwenden:

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'

Ich hatte bisher noch keine Gruppenbefehle zu erledigen, also habe ich das weggelassen, um Sie nicht auf den falschen Weg zu schicken. Zwei andere schnelle Dinge zu beachten. Ich bin nicht in der Lage gewesen, tatsächlich zwei Parametern beizutreten, obwohl es wie oben Möglichkeiten gibt, es zu umgehen. Auch der ?? Operator funktioniert wirklich gut anstelle von isnull in SQL.


Sie möchten das join into Konstrukt verwenden, um eine Gruppenabfrage zu erstellen.

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

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

Benutze einfach den obigen Code und das sollte funktionieren!







left-join