C# Abfrage 2 DataTables: Was ist nicht in der anderen ?

fmi

Newbie
Registriert
Juli 2015
Beiträge
2
Ich habe zwei Datentabellen (Datatables) erstellt, z.B. Tabelle1 und Tabelle2. In beiden gibt es dieselbe Spalte, z.B. "Name". Die Tabelle1 enthält 2.000 Namen, die Tabelle2 nur 30 Namen.
Ich will jetzt wissen, mit welcher Abfrage ich herausfinden kann, welcher der 30 Namen der Tabelle2 nicht in der Tabelle1 enthalten ist.
Ich gehe davon aus, dass kein Name doppelt vorkommt.

Da mir die anderen Spalten egal sind, kann ich jede Tabelle einzeln auswerten:

Tabelle1:
var Ergebnis1 = (from n in Tabelle1.AsEnumerable() select new {Name = n["Name"]};

Tabelle2:
var Ergebnis2 = (from n in Tabelle2.AsEnumerable() select new {Name = n["Name"]};

Jetzt will ich wissen, welcher meiner Namen von Tabelle2 nicht in Tabelle1 enthalten ist:

foreach (n in Ergebnis2)
{
tja, und hier weiß ich nicht weiter ....
}

In der foreach-Anweisung will ich eine neue Liste erstellen, die nur noch die Namen enthält, die nicht in der Tabelle1 enthalten sind.
Oder vielleicht kann man das Ganze auch direkter und eleganter ohne die Erstellung der beiden einzelnen Ergebnis-Listen bewerkstelligen. Kann mir jemand helfen?

Im voraus herzlichen Dank.
 
Da du ja schon LINQ nutzt um die Spalte zubekommen, spar dir das Foreach und löse es direkt mit einem Join
 
Danke für die Antwort.

Aber wie soll das mit dem Join konkret aussehen?

Mit

var Ergebnis = from f inTabelle1.AsEnumerable()
join b in Tabelle2.AsEnumerable()
on f["Name"] equals b["Name"]
select new {Name = f["Name"]};

erhalte ich eine Liste der Namen, die in beiden Tabellen stehen, also z.B. 27 Namen meiner Tabelle2 finde ich auch in Tabelle1, und diese 27 Namen liefert mir diese Join-Abfrage. Mich interessieren aber die 3 Namen aus meiner Tabelle2, die nicht in der Tabelle1 enthalten sind. Mit welcher Abfrage kann ich diese Liste erstellen ?

Danke und Gruß
 
Das kannst du doch so unterschiedlich lösen:

Beispielsweise so:
Code:
List<string> leftNames = (from item in Tabelle1
			   select item["Name"]).ToList();
var result = (from item in Tabelle2
	      where !rightNames.Contains(item["Name"])
	      select item).ToList();

Oder auch so:
Code:
var result = Tabelle2.Where(item => !Tabelle1.Any(item2 => item2["Name"] == item["Name"]));

Mit LINQ hast du da eigentlich viele Möglichkeiten.
 
Zuletzt bearbeitet:
Zurück
Oben