Comment puis-je exprimer le plus élégamment la jointure gauche avec SQL agrégé en tant que requête LINQ

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
请先 登录 后评论

2 réponses

AdamB

Ce n'est pas une réponse complète pour vous, mais sur la pièce de jointure de gauche, vous pouvez utiliser l'opérateur DefaultIfEmpty comme ceci :

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'

Je n'ai pas encore eu besoin de faire de commandes groupby, donc j'ai laissé cela de côté pour ne pas vous envoyer sur le mauvais chemin. Deux autres choses rapides à noter. Je n'ai pas pu joindre réellement deux paramètres bien que, comme ci-dessus, il existe des moyens de le contourner. Également ?? L'opérateur fonctionne très bien à la place de isnull dans SQL.

请先 登录 后评论
Orion Adrian

Vous allez vouloir utiliser la construction join into pour créer une requête de groupe.

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);
    }
}
请先 登录 后评论
  • 12 abonnés
  • 0 favoris,436 Feuilleter
  • vzczc posée à 2023-03-02 13:17