Dupliquer possible:
Comment effectuez-vous une jointure externe gauche en utilisant les méthodes d’extension linq
Je ne trouve pas d’exemple de jointure externe gauche de Linq lambda (avec méthodes d’extension), du moins, pas clair.
Disons que j’ai le tableau suivant:
Parent { PID // PK } Child { CID // PK PID // FK Text }
Je souhaite rejoindre Parent avec enfant et, pour chaque enfant manquant, je souhaite que la valeur par défaut de Text soit “[[Vide]]”. Comment puis-je faire cela avec la syntaxe linq lambda?
J’ai actuellement les éléments suivants:
var source = lParent.GroupJoin( lChild, p => p.PID, c => c.PID, (p, g) => new // ParentChildJoined { PID = p.PID; // How do I add child values here? });
Tu es proche. Les éléments suivants sélectionneront les PID
, CID
et le Text
pour chaque enfant, et les PID
, CID = -1
et Text = "[[Empty]]"
pour chaque parent sans enfant:
var source = lParent.GroupJoin( lChild, p => p.PID, c => c.PID, (p, g) => g .Select(c => new { PID = p.PID, CID = c.CID, Text = c.Text }) .DefaultIfEmpty(new { PID = p.PID, CID = -1, Text = "[[Empty]]" })) .SelectMany(g => g);
from p in Parent join c in Child on p.PID equals c.PID into g from c in g.DefaultIfEmpty select new { p.PID, CID = c != null ? (int?)c.CID : null, // Could be null Text = c != null ? c.Text : "[[Empty]]" }
Avec lambda:
class ChildResult { public int PID { get; set; } public int? CID { get; set; } public ssortingng Text { get; set; } } lParent.SelectMany(p => p.Childs.Any() ? p.Childs.Select(c => new ChildResult() { PID = c.PID, CID = c.CID, Text = c.Text }) : new [] { new ChildResult() { PID = p.PID, CID = null, Text = "[[Empty]]" } } );