Linq SqlMethods.Like schlägt fehl

7

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.

    
Russell Steen 06.04.2010, 12:02
quelle

4 Antworten

11

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:

%Vor%

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:)

    
Thomas Levesque 06.04.2010 14:28
quelle
4

Sie könnten ESQL machen und so etwas wie das Folgende tun.

%Vor%     
Nix 06.04.2010 12:53
quelle
4

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 .

    
casperOne 06.04.2010 14:14
quelle
0

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: Ссылка

    
brechtvhb 15.07.2015 07:45
quelle

Tags und Links