Laden...

Datatable - Werte, die in anderer Datatable enthalten sind herausfiltern

Erstellt von Adleano vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.385 Views
A
Adleano Themenstarter:in
31 Beiträge seit 2011
vor 10 Jahren
Datatable - Werte, die in anderer Datatable enthalten sind herausfiltern

Hallo zusammen,

ich habe ein Dataset mit mehreren Tabellen.

  • In der ersten Tabelle sind alle Einträge vorhanden, ohne eine Einschränkung.
  • In der zweiten Tabelle sind alle bereits verwendeten (Teilmenge aus 1. Tabelle) Einträge vorhanden.

Kann man jetzt in einer dritten Datatable alle Einträge filtern, die nicht in Verwendung sind? Also alle Einträge aus Tabelle 1, die nicht in Tabelle 2 enthalten sind? Oder alternativ auch die erste Tabelle so filtern, dass die verwendeten "ausgeblendet" sind?

Ziel ist die Anzeige aller nicht verwendeten Einträge in einem Datagridview.

Besten Dank.

W
955 Beiträge seit 2010
vor 10 Jahren
3.825 Beiträge seit 2006
vor 10 Jahren

Du kannst auch die Zeilen im ersten DataTable durchgehen und schauen welche schon in der zweiten Tabelle vorhanden sind.

Wenn Du die Infos zeilenweise ins Datagridview schreibst kannst Du bei jedem Einfügen prüfen ob die Zeile schon vorhanden ist, dann brauchst Du keine dritte Tabelle.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

A
Adleano Themenstarter:in
31 Beiträge seit 2011
vor 10 Jahren

Hallo zusammen,

vielen Dank für die Antworten.

Ich habe dazu folgende Funktion gebastelt:


public static IEnumerable<DataRow> TestExcept(DataSet TestDS)
        {
            
            IEnumerable<DataRow> DataRowsTable0 = TestDS.Tables[0].AsEnumerable();
            IEnumerable<DataRow> DataRowsTable1 = TestDS.Tables[1].AsEnumerable();
            IEnumerable<DataRow> result = DataRowsTable0.Except(DataRowsTable1);
            return result;
        }

In den jeweiligen Zeilen der Tabellen des übergebenen Datasets stehen jeweils nur Textwerte.

Aber leider bekomme ich immer auch die Einträge zurück, die herausgefiltert werden sollen.
Habe ich da noch einen Denkfehler drin?

Beispiele für die Einträge in den beiden Tabellen, die in jeweils einer Zeile stehen können:
A 987 ABC 1457
Z ABR 123 XXX

W
955 Beiträge seit 2010
vor 10 Jahren

Hallo,

DataRow ist eine Klasse und wird daher per Referenz verglichen. Auch wenn zwei DataRows gleichen Inhalt besitzen sind sie aber ungleich wenn sie nicht identisch sind/nicht dasselbe Objekt sind. Du müsstest daher noch den EqualityComparer implementieren und bei Except verwenden. Ich weiß nicht mwehr genau wie man mit DataRows umgeht, das müsstest Du noch anpassen.


public class TestDSDataRowComparer : IEqualityComparer<DataRow>
{
    bool IEqualityComparer<DataRow>.Equals(DataRow x, DataRow y)
    {
        //jetzt hier spaltenweise vergleichen  
        if (x.SpalteA != y.SpalteA) return false;
        if (x.SpalteB != y.SpalteB) return false;
        if (x.SpalteC != y.SpalteC) return false;
        return true;
    }
}

4.221 Beiträge seit 2005
vor 10 Jahren

Nur als Alternative... du könntest doch schon von der DB eine dritte Tabelle holen (Not in - Statement)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

F
115 Beiträge seit 2012
vor 10 Jahren

Hi,

falls Du - wie Programmierhans das vorschlägt - das Problem auf der Datenbank lösen möchtest, würde ich von "NOT IN" abraten und auch dort eher "EXCEPT" (bzw. "MINUS" in Oracle) oder aber einen "LEFT JOIN" verwenden. Lange IN-Listen können ziemlich langsam werden und NOT ist bei den meisten DBs nicht Index untersützt.

Gruß
f_igy

A
Adleano Themenstarter:in
31 Beiträge seit 2011
vor 10 Jahren

ich hab das Problem momentan in einem Dataset mit mehreren Tabellen.
Daher müsste dass dann ja mit einem Left Join gehen, oder?
Falls jemand grad die Syntax dazu im Kopf hat gerne. Werde aber selber gleich mal danach recherchieren.

Ich beschäftige mich erst seit kurzem mit den Datasets und ADO.NET...

Grüße

F
115 Beiträge seit 2012
vor 10 Jahren

Schau mal da:

101 LINQ Samples