Ich befolge die Tipps hier versuchen, die Aussage zu nutzen, dass die SQL nicht erstellt wird, bis der Enumerator ausgelöst wird. Allerdings bekomme ich den folgenden Fehler auf den Code unten. Ich verwende Linq2Entities, nicht linq2sql. Gibt es eine Möglichkeit, dies in Linq2entities zu tun?
Methode 'Boolean Like (System.String, System.String)' kann nicht auf dem Client verwendet werden; Es ist nur für die Übersetzung in SQL.
%Vor%Hinweise: db ist eine Entitätszuordnung zu einem SQL-Server.
Ich weiß nicht, wie Sie Entity Framework dazu bringen können, den "echten" LIKE-Operator zu verwenden, aber eine mögliche Lösung wäre, einen LIKE-Ausdruck in StartsWith
, Contains
und EndsWith
Zum Beispiel:
%Vor%Und so weiter ...
Beachten Sie, dass dies nicht genau äquivalent zur Verwendung von LIKE in SQL ist: zum Beispiel würde LIKE '%abc%bcd%'
zu Contains("abc") && Contains("bcd")
führen. Dies würde "abcd" entsprechen, obwohl die ursprüngliche LIKE-Bedingung nicht. Aber in den meisten Fällen sollte es gut genug sein.
Hier ist eine Beispielimplementierung, die PredicateBuilder
und LinqKit , um Ausdrücke basierend auf einem LIKE-Muster zu erstellen:
Und hier ist, wie Sie es verwenden könnten:
%Vor%Ich habe es gerade mit einem einfachen EF-Modell versucht, und es scheint gut zu funktionieren:)
Die SqlMethods
-Klasse soll gemeint sein Wird mit LINQ-to-SQL verwendet. Wenn Sie Methoden von ihm verwenden (die die öffentliche Dokumentation Ihnen sagt, dass Sie nicht tun sollen, ist es nicht für den öffentlichen Verbrauch), die IQueryable
Provider für LINQ-to-Entities weiß nicht, was damit zu tun ist oder wie man es übersetzt.
Wenn Sie am Anfang oder Ende des Filters einen einzelnen Platzhalter hätten, könnten Sie StartsWith
oder EndsWith
Methoden auf der String
class und LINQ-to-Entities unterstützen dies.
In diesem Fall haben Sie jedoch eine variable Anzahl von Platzhaltern. Daher müssen Sie auf die ESQL-Ebene herunterblättern und daraus eine Abfrage erstellen, wie in Nix 'Antwort .
Sie können ein echtes Like in Link zu Entitäten verwenden
Hinzufügen
%Vor%zu Ihrem EDMX in diesem Tag:
edmx: Edmx / edmx: Laufzeit / edmx: ConceptualModels / Schema
Merken Sie sich auch den Namensraum im Attribut <schema namespace="" />
Fügen Sie dann im obigen Namespace eine Erweiterungsklasse hinzu:
%Vor%Diese Erweiterungsmethode wird nun der EDMX-Funktion zugeordnet.
Weitere Informationen hier: Ссылка
Tags und Links .net linq-to-entities