Wie kann ich die meisten elegant express links mit aggregierten SQL als LINQ-Abfrage beitreten

stimmen
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
Veröffentlicht am 03/08/2008 um 22:22
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
8

Eine Lösung, wenn auch eines, das könnte auf den Code des Nullwertes aufschiebt Handhabung sein:

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

Dies führt nicht genau die gleiche SQL, aber das gleiche logische Ergebnis liefert. „Komplex“ SQL-Abfragen in LINQ zu übersetzen ist nicht immer einfach.

Beantwortet am 03/08/2008 um 22:31
quelle vom benutzer

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

Nur youse den obigen Code und dies sollte funktionieren!

Beantwortet am 18/04/2016 um 12:16
quelle vom benutzer

stimmen
0

Sie gehen zu wollen , die verwenden join intoKonstrukt , das eine Gruppe Abfrage 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);
    }
}
Beantwortet am 17/09/2008 um 06:28
quelle vom benutzer

stimmen
0

Dies ist keine vollständige Antwort für Sie, aber auf der linken Seite kommt Stück Sie den DefaultIfEmpty Operator wie so verwenden können:

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 habe nicht das Bedürfnis habe noch jede groupby zu tun befiehlt, so verließ ich, dass, wie Sie nicht den falschen Weg nach unten zu schicken. Zwei weitere schnelle Dinge zu beachten. Ich habe nicht in der Lage gewesen, um tatsächlich auf zwei Parameter zu kommen, obwohl, wie oben gibt es Möglichkeiten, um es zu bekommen. Auch der ?? Operator funktioniert wirklich gut anstelle der isnull in SQL.

Beantwortet am 28/08/2008 um 20:09
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more