Hoe kan ik het meest elegante express links bundelen met geaggregeerde SQL als LINQ query

stemmen
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
De vraag is gesteld op 03/08/2008 om 22:22
bron van user
In andere talen...                            


4 antwoorden

stemmen
8

Een oplossing, zij het dat uitstelt hanteren van de nulwaarde van de code, kan zijn:

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

Dit leidt niet tot exact dezelfde SQL, maar heeft dezelfde logische resultaat te bieden. Vertalen "complex" SQL queries naar LINQ is niet altijd eenvoudig.

antwoordde op 03/08/2008 om 22:31
bron van user

stemmen
0

Dit is niet een volledig antwoord voor u, maar aan de linkerkant te sluiten stuk kunt u de DefaultIfEmpty operator te gebruiken als volgt:

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'

Ik heb niet de behoefte om te doen elke GroupBy commando's nog niet, dus liet ik dat als je niet naar beneden te sturen het verkeerde pad. Twee andere snelle dingen op te merken. Ik ben niet in staat om daadwerkelijk mee te doen op twee parameters geweest hoewel zoals hierboven er zijn manieren om rond te komen. Ook de ?? operator werkt echt goed in plaats van de isnull in SQL.

antwoordde op 28/08/2008 om 20:09
bron van user

stemmen
0

Je gaat te willen het gebruiken join intoconstruct om een groep query te maken.

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);
    }
}
antwoordde op 17/09/2008 om 06:28
bron van user

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

Net youse de bovenstaande code en dit zou moeten werken!

antwoordde op 18/04/2016 om 12:16
bron van user

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