Frage

Ich kann nicht einen Zeiger in der richtigen Richtung zu finden scheinen, ich bin nicht einmal sicher, was die Begriffe sind, dass ich die Erforschung aber unzählige Stunden scheinen sollte googeln mich im Kreis zu spinnen, so hoffentlich der kollektiven Bienenstock Intelligenz von Stack-Überlauf kann helfen.

Das Problem ist dieses, ich brauche eine Möglichkeit, Daten zu filtern, in dem, was ich kann eine Verbindung Logikbaum nur nennen. Derzeit führt das System ein einfaches und Filtersystem. Zum Beispiel kann sagen, wir einen Datensatz von Menschen haben. Sie fügen eine Reihe von Filtern, die alle Menschen zeigen, wo (Geschlecht = weiblich) und (Alter> 23) und (Alter <30) und (Status = Single). Einfach genug, durchlaufen jedes Element auf einen gültigen Artikel Sammlung nur, wenn jede Bedingung wahr ist.

Das Problem, das ich begegnet bin ist, wie gehe ich mit dem Anwender komplexe Abfragen zu bauen in der Lage beteiligt und ist und oder die? Ich denke an so etwas wie ein Baum, in dem jeder Knoten darstellt und Ausdruck ihre Kinder wahr oder falsch zu bewerten. Ein einfaches Beispiel wäre - Filter bis ((Sex == männlich und Alter == 25) OR (Sex == Female und Status == Single)) UND IQ> 120 Leider kann ich kein besseres Beispiel denken an der Moment. Aber wie würden Sie gehen über diese Art der Ausdrucksbaum darstellt, und die Auswertung der Elemente in einer Auflistung gegen diese Filter. Was sind einige Hinweise, die helfen würde? Zum Teufel, was einige verdammt Google Suche sind, die in eine positive Richtung führen könnte?!

Dank jeder, jede mögliche Hilfe anbieten können.

Hier ist ein Beispiel für eine Verbindung Abfrage in Baumform einen Datensatz von Menschen mit

  • Abfrage - Zeige mir alle Menschen, wo Sex männlich und Augen sind grün oder Geschlecht ist weiblich, die Augen sind blau, oder Status ist Single. In Paren Form (Sex == männlich && Augen == Grün) || (Sex == Female && (Augen == Blau || Der Status == Single))

So in Baumform im Denken

o-Root Node
  - And - Sex = Male
     - And - Eyes = Blue
  - Or - Sex = Female
     - And Eyes = Blue
     - Or Status = Single

Ich glaube, die Lösung ist, die jeden Knoten solche in einer Datenstruktur wie

darstellen
Node
{
   OpType - AND or OR
   ExpressionField - The field to evaluate
   ExpressionOp -   =, !=, >, >=, <, <=
   ExpressionValue - the value to compare the field's value against

   Function Evaluate() - returns a bool
}

So für einen bestimmten Knoten, die chilren zu bewerten, wenn Sie ein UND-Knoten sind, dann true zurück, wenn Ihr Ausdruck Ergebnisse in wahr und alle Ihre und Kinder zu wahren bewerten oder eine OR Kind true ausgewertet und Rekursion auf.

Es scheint, jede begriffliche Bedingung zu erfüllen ich an ihm werfen können, aber wir werden ich es da einmal implementieren. Ich werde den echten Code bis später posten, wenn seine Arbeits und Bilder zu helfen, dieses Problem zu beschreiben besser für andere.

War es hilfreich?

Lösung

Ihre Analyse des Ausdrucks ((Sex == männlich und Alter == 25) OR (Sex == Female und Status == Single)) UND IQ> 120 sieht seltsam aus. Ich würde analysiert es als:

* And
    * Or
        * And
            * ==
                * Sex
                * Male
            * ==
                * Eyes
                * Blue
        * And
            * ==
                * Sex
                * Female
            * ==
                * Status
                * Single
    * >
        * IQ
        * 120

Der Baum Typ wäre:

Node
{
    bool evaluate ()
}

AndNode : Node
{
    Node left
    Node right

    bool evaluate ()
    {
        return left.evaluate () && right.evaluate ()
    }
}

// OrNode is similar

EqualsNode : Node
{
    Field field
    Value value

    bool evaluate ()
    {
        return field.value () == value
    }
}

// Likewise for <, >, etc

Andere Tipps

Diese Arten von Abfragen werden häufig als ORed Array von ANDed Klauseln dargestellt. Das heißt, ein Tabellenformat, in dem Sie über mehrere Bedingungen lesen ANDed zusammen, und dann lesen Sie unten, sie OR. Das führt zu einem gewissen Wiederholung von Bedingungen, ist aber für die Benutzer einfach zu lesen, schreiben und verstehen. Ihre Probe ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120 würde so aussehen

Sex == Male   & Age == 25        & IQ > 120 
Sex == Female & Status == Single & IQ > 120 

Sie können nach Begriffen wie ‚Prädikat Kalkül‘ zu Google wollen und ‚konjunktive Normalform‘.

Ich muss sagen, dass aus diesem Grund Datenbank-Engines gebaut werden. Sie können alles tun, was Sie mit Set-Logik erfordert und Sie können sogar zu dem Ergebnis gelangen Sie suchen, aber Thesen sind Standard von Datenbanken und SQL-Probleme gelöst. Sie können für eine in Linq auch einen Blick in Code-Lösung.

Klingt wie Sie eine Benutzeroberfläche erstellen müssen, die die Schaffung eines einfachen Parse-Baum ermöglicht. Wenn die GO drückt können Sie dann den Baum gehen und einen LINQ-Ausdrucksbaum von dieser Benutzeroberfläche Struktur erstellen. Führen Sie die LINQ-Abfrage und verarbeitet dann die Ergebnisse je nach Bedarf. Deshalb möchte ich Sie empfehlen lesen Sie auf LINQ Ausdruck Bäume.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top