Come faccio più elegantemente espressa sinistra unisco con SQL aggregato query LINQ

voti
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
È pubblicato 03/08/2008 alle 22:22
fonte dall'utente
In altre lingue...                            


4 risposte

voti
8

Una soluzione, anche se uno che differisce movimentazione del valore nullo al codice, potrebbe essere:

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

Questo non produce esattamente la stessa SQL, ma non fornisce lo stesso risultato logico. Traduzione "complessi" query SQL per LINQ non è sempre semplice.

Risposto il 03/08/2008 a 22:31
fonte dall'utente

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

Basta youse il codice di cui sopra e questo dovrebbe funzionare bene!

Risposto il 18/04/2016 a 12:16
fonte dall'utente

voti
0

Si sta andando a voler utilizzare il join intocostrutto per creare una query di gruppo.

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);
    }
}
Risposto il 17/09/2008 a 06:28
fonte dall'utente

voti
0

Questa non è una risposta completa per voi, ma a sinistra unirsi pezzo è possibile utilizzare l'operatore DefaultIfEmpty in questo modo:

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'

Non ho avuto la necessità di fare i comandi ancora alcun groupby, così ho lasciato che fuori da non inviarti sulla strada sbagliata. Altre due cose subito notare. Sono stato in grado di unire in realtà su due parametri, anche se come sopra ci sono modi per aggirare l'ostacolo. Anche il ?? operatore lavora davvero bene al posto del IsNull in SQL.

Risposto il 28/08/2008 a 20:09
fonte dall'utente

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