En supposant que j'ai une jointure externe gauche en tant que telle:
from f in Foo
join b in Bar on f.Foo_Id equals b.Foo_Id into g
from result in g.DefaultIfEmpty()
select new { Foo = f, Bar = result }
Comment exprimer la même tâche en utilisant des méthodes d'extension? Par exemple
Foo.GroupJoin(Bar, f => f.Foo_Id, b => b.Foo_Id, (f,b) => ???)
.Select(???)
c#
linq-to-sql
lambda
LaserJesus
la source
la source
GroupJoin
la jointure externe gauche est utilisée, laSelectMany
pièce n'est nécessaire qu'en fonction de ce que vous souhaitez sélectionner.Étant donné que cela semble être la question de facto SO pour les jointures externes gauches à l'aide de la syntaxe de la méthode (extension), j'ai pensé ajouter une alternative à la réponse actuellement sélectionnée qui (dans mon expérience au moins) a été plus communément ce que je suis après
Pour afficher la différence à l'aide d'un simple ensemble de données (en supposant que nous nous joignons aux valeurs elles-mêmes):
L'option 2 est fidèle à la définition typique de jointure externe gauche, mais comme je l'ai mentionné précédemment, elle est souvent inutilement complexe en fonction de l'ensemble de données.
la source
Single
vérification au milieu d'une jointure.SingleOrDefault
est cependant une manière plus "correcte" de démontrer cette OMI.La méthode Group Join n'est pas nécessaire pour réaliser la jonction de deux ensembles de données.
Jointure interne:
Pour la jointure gauche, ajoutez simplement DefaultIfEmpty ()
EF et LINQ to SQL se transforment correctement en SQL. Pour LINQ to Objects, il est préférable de se joindre à l'aide de GroupJoin car il utilise en interne la recherche . Mais si vous interrogez DB, le saut de GroupJoin est AFAIK comme performant.
Personlay pour moi de cette façon est plus lisible que GroupJoin (). SelectMany ()
la source
Vous pouvez créer une méthode d'extension comme:
la source
Améliorant la réponse d'Ocelot20, si vous avez une table qui vous reste à l'extérieur avec où vous voulez juste 0 ou 1 lignes, mais elle peut en avoir plusieurs, vous devez Commander votre table jointe:
Sinon, la ligne que vous obtenez dans la jointure sera aléatoire (ou plus précisément, selon la base de données qui se trouve en premier).
la source
Transformer la réponse de Marc Gravell en une méthode d'extension, j'ai fait ce qui suit.
la source
Bien que la réponse acceptée fonctionne et soit bonne pour Linq to Objects, cela m'a dérangé que la requête SQL ne soit pas simplement une jointure externe gauche droite.
Le code suivant s'appuie sur le projet LinkKit qui vous permet de passer des expressions et de les invoquer dans votre requête.
Il peut être utilisé comme suit
la source
Il existe une solution simple à ce problème
Utilisez simplement .HasValue dans votre Select
Très facile, pas besoin de groupjoin ou autre chose
la source