Die groß / Kleinschreibung bei string-vergleichen im LINQ-Ausdruck

Ich versuche zu schreiben ein ExpressionVisitor zu wickeln um meine LINQ-zu-Objekt-Ausdrücke automatisch in Ihre string-Vergleiche mit groß-und Kleinschreibung, so wie Sie in LINQ-to-entities.

EDIT: ich möchte auf jeden Fall verwenden Sie eine ExpressionVisitor anstatt einfach anwenden einige benutzerdefinierte Erweiterung oder etwas zum Ausdruck, wenn es erzeugt wird, für einen wichtigen Grund: Der Ausdruck wird weitergeleitet, um meine ExpressionVisitor erzeugt wird, durch den ASP.Net Web-API ODATA-Schicht, so dass ich keine Kontrolle darüber, wie es generiert wird (d.h. ich kann nicht Kleinbuchstaben der Zeichenkette des gesuchten mit Ausnahme von in dieser ExpressionVisitor).

Unterstützen LINQ to Entities. Nicht nur die Erweiterung.

Hier ist, was ich habe, so weit. Es sieht für einen Aufruf von "Enthält" auf einen string um und ruft dann ToLower auf jedes Mitglied Zugang in den Ausdruck.

Aber es funktioniert nicht. Wenn ich die Ausdrücke anzuzeigen, nach meinen änderungen, sieht es korrekt zu mir, so bin ich nicht sicher, was ich tun könnte falsch.

public class CaseInsensitiveExpressionVisitor : ExpressionVisitor
{

    protected override Expression VisitMember(MemberExpression node)
    {
        if (insideContains)
        {
            if (node.Type == typeof (String))
            {
                var methodInfo = typeof (String).GetMethod("ToLower", new Type[] {});
                var expression = Expression.Call(node, methodInfo);
                return expression;
            }
        }
        return base.VisitMember(node);
    }

    private Boolean insideContains = false;
    protected override Expression VisitMethodCall(MethodCallExpression node)
    {
        if (node.Method.Name == "Contains")
        {
            if (insideContains) throw new NotSupportedException();
            insideContains = true;
            var result = base.VisitMethodCall(node);
            insideContains = false;
            return result;
        }
        return base.VisitMethodCall(node);
    }

Wenn ich einen Haltepunkt auf der "return Ausdruck" Zeile in der VisitMember Methode und dann die "ToString" auf die "Knoten" und "Ausdruck" - Variablen, die Pause wird zweimal getroffen, und hier ist, was die beiden Werte sind:

Erste Treffer:

node.ToString()
"$it.LastName"
expression.ToString()
"$it.LastName.ToLower()"

Zweiten Treffer:

node.ToString()
"value(System.Web.Http.OData.Query.Expressions.LinqParameterContainer+TypedLinqParameterContainer`1[System.String]).TypedProperty"
expression.ToString()
"value(System.Web.Http.OData.Query.Expressions.LinqParameterContainer+TypedLinqParameterContainer`1[System.String]).TypedProperty.ToLower()"

Ich weiß nicht genug über Ausdrücke, um herauszufinden, was ich falsch mache an dieser Stelle. Irgendwelche Ideen?

  • string.Equals(string1, string2, StringComparison.InvariantCultureIgnoreCase)?
  • Vermeiden ToLower für string-Vergleich, wie es mit größerer Wahrscheinlichkeit zu einem Fehler führen (Türkei Test). Verwenden Sie entweder groß-oder vorzugsweise, wie Corak vorgeschlagen, String.Entspricht.
  • Diese funktioniert nicht in meinem Fall. Erstens, ich haben keine Kontrolle über den Ausdruck, da es automatisch durch die ASP.Net Web-API. Zweitens möchte ich etwas, das ich kann generisch verwenden, um wickeln Sie eine LINQ-Anweisung und die Arbeit mit LINQ-to-entities und LINQ-to-objects.
  • Ja, ich lese über die Türkei Testen. Ich bin nicht besorgt mit, dass an diesem Punkt. Aber ich werde versuchen, mit Großbuchstaben, anstelle, sobald ich diese zu arbeiten.
  • Vertrauen, du machst das gut, Hast du am Ende schreiben gesamte ODATA --> LINQ --> SQL manuell, keine ODATA-V4-framework hat nicht geholfen? stackoverflow.com/q/47055350/1431250
InformationsquelleAutor Josh Mouch | 2013-07-02
Schreibe einen Kommentar