Hvordan kan jeg mest elegant uttrykte venstre slutte med aggregat SQL som LINQ spørring

stemmer
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
Publisert på 03/08/2008 klokken 21:22
kilden bruker
På andre språk...                            


4 svar

stemmer
8

En oppløsning, enn en som utsetter håndtering av nullverdien til kode, kan være:

Datetime går = 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()
    };

Dette produserer ikke akkurat det samme SQL, men gir ikke samme logiske resultatet. Sette "komplekse" SQL-spørringer til LINQ er ikke alltid enkelt.

Svarte 03/08/2008 kl. 21:31
kilden bruker

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

Bare youse koden ovenfor og dette skal fungere fint!

Svarte 18/04/2016 kl. 12:16
kilden bruker

stemmer
0

Du kommer til å ønske å bruke join intokonstruksjonen for å opprette en gruppe spørring.

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);
    }
}
Svarte 17/09/2008 kl. 05:28
kilden bruker

stemmer
0

Dette er ikke en full svar til deg, men til venstre bli brikke du kan bruke DefaultIfEmpty operatøren slik:

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'

Jeg har ikke hatt behov for å gjøre noe groupby kommandoer ennå, så jeg forlot det ut til å ikke sende deg ned i feil retning. To andre raske ting å merke seg. Jeg har ikke vært i stand til å faktisk delta på to parametre selv som ovenfor det finnes måter å komme rundt det. Også, ?? Operatøren fungerer veldig bra i stedet for isnull i SQL.

Svarte 28/08/2008 kl. 19:09
kilden bruker

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