4 Stimmen

Bedingte Verknüpfung in LINQ?

Ich versuche, eine Abfrage zu schreiben, die Informationen aus einer Datenbank abruft und sie mit Informationen in einer anderen Datenbank verknüpft.

TableA
idA
valueA
idB

TableB
idB
valueB

Der knifflige Teil ist, dass in TabelleA, idB nicht immer definiert ist, so dass, wenn ich eine normale Verknüpfung tun, ich nur Ergebnisse erhalten, wo TabelleA einen idB-Wert hat. Ich möchte jedoch alle Informationen aus TabelleA abrufen können, auch wenn sie keinen entsprechenden idB-Wert haben.

5voto

Anthony Pegram Punkte 119149

Hier ist eine Abfrageausdrucksyntaxversion der linken Verknüpfung, um die Antwort von tvanfosson weiterzuverfolgen.

var query = from rowA in db.TableA
            join rowB in db.TableB
            on rowA.idB equals rowB.idB into b
            from item in b.DefaultIfEmpty()
            select new
            {
                idA = rowA.idA,
                valueA = rowA.valueA,
                idB = rowA.idB, 
                valueB = item != null ? item.valueB : 0 // or other default value
            };

3voto

tvanfosson Punkte 506878

Verwenden Sie eine linke äußere Verknüpfung, indem Sie prüfen, ob der von der rechten Seite zurückgegebene Wert null ist, und einen Standardwert für diesen Fall angeben.

 var q = db.TableA.Join( db.TableA,
                         a => a.idB,
                         b => b.idB,
                         (a,b) => new
                                  {
                                      A = a.ValueA,
                                      B = b == null ? null : b.ValueB
                                  });

0voto

Richard Punkte 103159

Sie können eine Left Outer Join in LINQ mit SelectMany (direkter Aufruf Queryable Methoden) oder in der Verständnissyntax join ... into :

var results = from a in db.TableA
              join b in db.TableB on a.idB equals b.idB
                into found
              select new {
                A = a,
                Bs = found
              };

In der Ausgabe Bs wird sein IEnumerable<typeof-db-TableB>

0voto

Beispiel für den linken Join:

var leftOuterJoinQuery =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID into prodGroup
    from item in prodGroup.DefaultIfEmpty(new Product{Name = String.Empty, CategoryID = 0})
        select new { CatName = category.Name, ProdName = item.Name };

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