Extrahieren Sie alle Bedingungen aus Ausdruck nach Typ

8

Gegeben ein Expression<Func<TEntity, bool>> entlang der Zeilen von

%Vor%

Ich versuche, eine Listeneigenschaftsbedingung nach Typ zu extrahieren, d. h.

%Vor%

Bisher habe ich ein ExpressionVisitor erstellt und die Methode VisitBinary als diejenige identifiziert, in die ich mich einfügen möchte, um meine Informationen zu erhalten.

Ich bin immer noch ratlos gegenüber

  • wie kann ich feststellen, ob die BinaryExpression , die ich betrachte, eine terminale Aussage darstellt (in dem Sinne, dass es keine verschachtelten Ausdrücke mehr gibt, die ich mir ansehen muss)
  • wie man den Entitätstyp ermittelt, mit dem BinaryExpression beschäftigt ist
  • ob ich eine der anderen ExpressionVisitor -Methoden überschreiben muss, um Fälle abzudecken, die ich noch nicht berücksichtigt habe.
vzwick 27.01.2016, 16:24
quelle

1 Antwort

4

Nicht sicher, was wirklich der Anwendungsfall ist, aber hier ist ein Anfangspunkt

%Vor%

Die Idee ist einfach. Überschreiben Sie die Methode Visit nur, um einen Stapel Verarbeitungsausdrücke zu verwalten. Die Hauptverarbeitung befindet sich innerhalb der VisitMember override, die für jedes Property / Feld-Accessor aufgerufen wird. Die node.Expression.NodeType != ExpressionType.Constant wird verwendet, um die Closure-Elemente zu eliminieren, während die zweite Bedingung die Auflistungseigenschaften eliminiert. Schließlich wird der Ausdruck der potentiellen Bedingung aus dem Stapel extrahiert.

Das Ergebnis enthält sowohl MemberExpression als auch Expression , wo es verwendet wird. MemberExpression.Expression.Type ist Ihr Entitätstyp, MemberExpression.Member ist die Eigenschaft / das Feld dieses Typs.

Beispieltest:

%Vor%     
Ivan Stoev 28.01.2016, 11:07
quelle