Bindingsource Filter zusammenstellen mittels LINQ

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Bindingsource Filter zusammenstellen mittels LINQ

    Hallo Mitstreiter,

    es existiert eine Tabelle mit Artikeln "SparepartDataNew" (Artikelnummer, Bezeichnung, Preisen, Lieferant, etc.) und eine Subtabelle mit den Lagerinformationen "WarehouseStockNew" (Menge, Lagerort, etc.)
    Die Tabelle mit den Artikel hat als Index das Feld "SparePart_ID", dieses Feld gibt es auch in der untergeordneten Tabelle mit identischen Namen, nur ist es hier kein Key.
    Eine entsprechende Beziehung existiert.
    Soweit so gut, es läuft auch alles. Was mir Probleme bereitet ist einen Filter zu bauen, der mir nur die Artikel zeigt, wo es in der Subtabelle Lagerinformationen mehr als einen Eintrag gibt, also zum Beispiel:
    Menge 5 im Lagerort "Container" und Menge 3 im Lagerort "Regal 4711".

    Im Internet habe ich Beispiele gefunden, die einen Filter aufbauen helfen und subtabellen berücksichtigen, getestet habe ich bisher noch nichts, denn es fehlt die für mich wesentliche Beschränkung auf die Anzahl der gefunden Einträge pro Artikel (Count > 1).

    Hier die Lösungsansätze die ich bis jetzt an meine Gegebenheiten angepasst habe:

    Spoiler anzeigen

    C#-Quellcode

    1. var results = from parts in spareParts.SparepartDataNew.AsEnumerable()
    2. from stock in spareParts.WarehouseStockNew.AsEnumerable()
    3. where parts.SparePart_Id == stock.SparePart_Id
    4. select parts;
    5. bsSparepartDataNew.Filter = ("SparePart_Id =" + String.Join(" OR SparePart_Id = ", results.ToList()));


    oder

    C#-Quellcode

    1. var results = from parts in spareParts.SparepartDataNew.AsEnumerable()
    2. join stock in spareParts.WarehouseStockNew.AsEnumerable() on parts.SparePart_Id equals stock.SparePart_Id
    3. select parts;
    4. bsSparepartDataNew.Filter = ("SparePart_Id =" + String.Join(" OR SparePart_Id = ", results.ToList()));



    Wie bekomme ich die Abfrage so hin, dass die Anzahl der

    Quellcode

    1. stock.SparePart_Id
    als Abfrageerweiterung verwenden kann?

    Danke.
    Hallo @Dksksm!

    Damit dich dich richtig verstehe:
    Du willst also die Zwei Tabellen SparePartDataNew und WareHouseStockNew anhand des Feldes SparePart_ID verknüpfen.
    Die beiden Tabellen stehen über eine 1:n (SparePartDataNew 1:n WareHouseStockNew) Kardinalität in Verbindung.
    Zur Anzeige willst du alle Einträge aus SparePartDataNew bringen, für welche es nur einen einzigen Eintrag in WareHouseStockNew gibt?

    Dksksm schrieb:

    Im Internet habe ich Beispiele gefunden
    Oh...*augenroll* ;D

    Dksksm schrieb:

    die einen Filter aufbauen helfen und subtabellen berücksichtigen
    Ich würde an deiner Stelle in der BindingSource keinen Filter verwenden. Mach das Ganze doch lieber gleich mit LINQ: Daten aus Datenbank über LINQ beziehen und anschließend noch mittels LINQ filtern. Geht erstens schneller, zweitens hast du dann nicht so viele unbenutze Datensätze im Control stehen (=Speicherverbrach, Performance) und drittens hast du dann die Intellisense Unterstützungs von Visual Studio
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Hallo @Radinator,

    Ich beziehe keine Daten aus einer DB sondern aus einer XML-Datei eines Dienstleisters, die ich konvertieren muss. Ich lese die Daten in ein typsiertes Dataset (was man auch am Code erkennen kann) ein und verarbeite sie von dort um sie dann neu für eine Schnittstelle aufzubereiten und auszugeben.
    Ich brauch den Filter als Kontrollmöglichkeit, bestimmte Lagernummern dürfen nicht in den Daten enthalten sein, aber ich will auch nicht automatisch etwas "umbuchen", was ich könnte. D.h. ich will solche Datensätze sehen, aber nur wenn ich den Filter bewusst aktiviere.

    Das Augenrollen versteh ich nicht, ich habe vor 5 Jahren mit der Programmierung nach vielen Jahren Pause neu aufgenommen und dabei wäre ich ohne Internet (dazu gehört auch dieses Forum und Codeproject.com) ziemlich aufgeschmissen gewesen. Mit den "vier Views" vom @ErfinderDesRades habe ich quasi begonnen. Spreu vom Weizen kann ich schon gut unterscheiden, aber LINQ ist trotzdem nicht gerade meine Stärke, es dauert halt und suche mir Beispiele die ich auf meine Anwendung umsetzen kann, wenn ich keinen eigenen Ansatz auf Anhieb finde. Ich bin viele Jahre damit sehr gut gefahren.

    Ich denke ich komme auch alleine weiter, bin gerade am Ausprobieren wie das mit dem Gruppieren funktioniert.

    Dksksm schrieb:

    was man auch am Code erkennen kann
    Wo kann man das an deinem Code gut erkennen?

    Dksksm schrieb:

    bsSparepartDataNew
    Der Prefix bs deutet im Normalfall auf eine BindungSource hin!

    Dksksm schrieb:

    Das Augenrollen versteh ich nicht
    Deswegen hab ich ja auch danach den ;D Smiley gemacht

    Dksksm schrieb:

    aber LINQ ist trotzdem nicht gerade meine Stärke
    Ach. Wenn du SQL kannst, dann tust du dir in LINQ gaanz leicht.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell