5 Stimmen

LINQ to Entities drei Tabellen Join-Abfrage

Ich habe ein paar Probleme mit einer Abfrage in Linq to Entities, die ich hoffe, jemand kann ein Licht auf :-) Ich versuche, eine Abfrage zu erstellen, die drei Tabellen miteinander verbindet.

Bis jetzt funktioniert es, aber da die letzte Tabelle, die ich zu verknüpfen versuche, leer ist, enthält das Ergebnis der Abfrage keine Datensätze. Wenn ich die letzte Verknüpfung entferne, erhalte ich die richtigen Ergebnisse.

Meine Anfrage sieht folgendermaßen aus:

var query = from p in db.QuizParticipants
            join points in db.ParticipantPoints on p.id 
            equals points.participantId into participantsGroup
            from po in participantsGroup
            join winners in db.Winners on p.id 
            equals winners.participantId into winnersGroup
            from w in winnersGroup
            where p.hasAttended == 1 && p.weeknumber == weeknumber
            select new
            {
                ParticipantId = p.id,
                HasAttended = p.hasAttended,
                Weeknumber = p.weeknumber, 
                UmbracoMemberId = p.umbMemberId,
                Points = po.points,
                HasWonFirstPrize = w.hasWonFirstPrize,
                HasWonVoucher = w.hasWonVoucher                                    
            };

Ich möchte einige Datensätze erhalten, auch wenn die Tabelle Winners leer ist oder keine Übereinstimmung enthält.

Für jede Hilfe/jeden Hinweis in dieser Sache sind wir sehr dankbar! :-)

Vielen Dank im Voraus.

/ Bo

5voto

Joel C Punkte 5467

Wenn Sie diese als verwandte Entitäten einrichten, anstatt sie zu verknüpfen, wird es einfacher sein, das zu tun, was Sie vorhaben.

var query = from p in db.QuizParticipants
            where p.hasAttended == 1 && p.weeknumber == weeknumber
            select new
            {
                ParticipantId = p.id,
                HasAttended = p.hasAttended,
                Weeknumber = p.weeknumber, 
                UmbracoMemberId = p.umbMemberId,
                Points = p.ParticipantPoints.Sum(pts => pts.points),
                HasWonFirstPrize = p.Winners.Any(w => w.hasWonFirstPrize),
                HasWonVoucher = p.Winners.Any(w => w.hasWonVoucher)
            };

Dies ist eine Annahme hasWonFirstPrize y hasWonVoucher sind boolesche Felder, aber Sie können jede beliebige Aggregatfunktion verwenden, um die gewünschten Ergebnisse zu erhalten, z. B. p.Winners.Any(w => w.hasWonFirstPrize == 1)

4voto

cadrell0 Punkte 16771

Ich verwende die Abfragesyntax nicht oft, aber ich glaube, Sie müssen die from w in winnersGroup a from w in winnersGroup.DefaultIfEmpty()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X