Răspuns Dynamisches LinQ Statement und Where Abfrage

  • Freitag, 6. April 2012 13:58
     
      Enthält Code

    Hallo!

    Folgende Situation, ich habe ein Master-Child Szenario.
    Kunden -> Aufträge

    Ich möchte für eine Werbeafrage ein dynamisches LinQ aufbauen, was eigentlich nicht so schwer sein sollte, aber ich bekomme es nicht hin...

    Folgende Situation:

    Dim myKunden = From Kunde In myDataContext.Kundenstamms Order By Kunde.Nname, Kunde.Vname

    Von dieser Grundabfrage möchte ich jetzt, je nach dem ob eine Option angehackt ist, oder nicht Where Abfragen einbauen:

    If rdbOffen.Checked = True Then
                    myKunden = myKunden.Where(Function(kunde) kunde.Auftrags.Where(Function(auftrag) auftrag.Bewegung = 0))
                ElseIf rdbFakturiert.Checked = True Then
                    myKunden = myKunden.Where(Function(kunde) kunde.Auftrags.Where(Function(auftrag) auftrag.Bewegung = 1))
                End If

    Das Problem ist, dass ich eine Fehlermeldung bei ".Where(..." bekomme:

    Fehler	2	Fehler bei der Überladungsauflösung, da keine zugreifbare "Where" mit diesen Argumenten aufgerufen werden kann: 
        In "System.Linq.Queryable" definierte Erweiterungsmethode "Public Function Where(predicate As System.Linq.Expressions.Expression(Of System.Func(Of VOptNeuContext.Kundenstamm, Integer, Boolean))) As System.Linq.IQueryable(Of VOptNeuContext.Kundenstamm)": Die Signatur der geschachtelten Funktion ist nicht mit dem Delegaten "System.Func(Of VOptNeuContext.Kundenstamm, Integer, Boolean)" kompatibel.
        In "System.Linq.Queryable" definierte Erweiterungsmethode "Public Function Where(predicate As System.Linq.Expressions.Expression(Of System.Func(Of VOptNeuContext.Kundenstamm, Boolean))) As System.Linq.IQueryable(Of VOptNeuContext.Kundenstamm)": Der Wert vom Typ "System.Collections.Generic.IEnumerable(Of VOPT.VOptNeuContext.Auftrag)" kann nicht in "Boolean" konvertiert werden.
        In "System.Linq.Enumerable" definierte Erweiterungsmethode "Public Function Where(predicate As System.Func(Of VOptNeuContext.Kundenstamm, Integer, Boolean)) As System.Collections.Generic.IEnumerable(Of VOptNeuContext.Kundenstamm)": Die Signatur der geschachtelten Funktion ist nicht mit dem Delegaten "System.Func(Of VOptNeuContext.Kundenstamm, Integer, Boolean)" kompatibel.
        In "System.Linq.Enumerable" definierte Erweiterungsmethode "Public Function Where(predicate As System.Func(Of VOptNeuContext.Kundenstamm, Boolean)) As System.Collections.Generic.IEnumerable(Of VOptNeuContext.Kundenstamm)": Der Wert vom Typ "System.Collections.Generic.IEnumerable(Of VOPT.VOptNeuContext.Auftrag)" kann nicht in "Boolean" konvertiert werden.	

    Wie kann ich das Problem sonst lösen? - DANKE für jeden Tipp! - Frohes Osterfest...

Alle Antworten

  • Freitag, 6. April 2012 14:10
     
     Beantwortet Enthält Code

    Macht Any statt Where, also

    If rdbOffen.Checked = True Then
                    myKunden = myKunden.Where(Function(kunde) kunde.Auftrags.Any(Function(auftrag) auftrag.Bewegung = 0))
                ElseIf rdbFakturiert.Checked = True Then
                    myKunden = myKunden.Where(Function(kunde) kunde.Auftrags.Any(Function(auftrag) auftrag.Bewegung = 1))
                End If

    das, was du erreichen willst? Das selektierte dann alle Elemente in myKunden, für die mindestens ein Auftrag in kunde.Auftrags existiert, für den die Eigenschaft Bewegung "1" bzw. "0" ist.

    Ansonsten musst du mal genauer erklären, was du abfragen willst und die deine Klassen aussehen, die du abfragen  willst.


    MVP Data Platform Development My blog

    • Als Antwort markiert Zero-G. _ Freitag, 6. April 2012 15:07
    •  
  • Freitag, 6. April 2012 15:07
     
     

    Hey Martin!

    DANKE - Das wars, wonach ich suchte - Schönen DANK