Linq SqlMethods.Wie schlägt fehl
Bin ich nach den Tipps hier, versuchen zu nutzen die Anweisung, die sql nicht erst erstellt, wenn der enumerator wird ausgelöst. Jedoch bekomme ich die folgende Fehlermeldung, die auf dem code unten. Ich bin mit Linq2Entities, nicht linq2sql. Gibt es eine Möglichkeit, dies zu tun in Linq2entities?
Methode " Boolean Like(System.String, System.String)' nicht auf dem client verwendet; es ist nur für die übersetzung in SQL.
query = db.MyTables.Where(x => astringvar.Contains(x.Field1));
if (!String.IsNullOrEmpty(typeFilter))
{
if (typeFilter.Contains('*'))
{
typeFilter = typeFilter.Replace('*', '%');
query = query.Where(x=> SqlMethods.Like(x.Type, typeFilter));
}
else
{
query = query.Where(x => x.Type == typeFilter);
}
}
Bemerkungen: db ist eine Einheit Zuordnung zu einem sql-server.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, wie Sie Entity Framework verwenden Sie die "echte" LIKE-operator, aber ein möglicher workaround wäre, um auszudrücken, einen LIKE-Ausdruck in Bezug auf
StartsWith
,Contains
undEndsWith
Zum Beispiel :
Und so weiter...
Beachten Sie, dass es nicht genau entspricht, WIE in SQL : zum Beispiel
LIKE '%abc%bcd%'
führen würdeContains("abc") && Contains("bcd")
. Dies würde mit "abcd" obwohl die original-LIKE-Bedingung nicht. Aber für die meisten Fälle sollte es gut genug sein.Hier ist eine Beispiel-Implementierung, mit
PredicateBuilder
und LinqKit zu bauen Ausdrücke basiert auf einem LIKE-Muster :Und hier ist, wie man es nutzen kann :
Ich habe gerade versucht es mit einer einfachen EF-Modell, und es scheint zu funktionieren 🙂
LIKE '%a%b%' => StartsWith("a") && Contains("b")
ist nicht wahr, Sie haben ein Prozent zu viel am start.LIKE 'a%b%'
ist besser.Könnten Sie tun, ESQL und etwas tun, wie die unten..
Den
SqlMethods
Klasse sollte verwendet werden, mit LINQ-to-SQL. Wenn Sie verwenden Methoden, von denen die öffentliche Dokumentation sagt, dass Sie nicht zu tun, es ist nicht für die öffentlichkeit bestimmt), dieIQueryable
- provider für LINQ-to-Entities, die nicht wissen, was zu tun ist oder wie man es übersetzen.Wenn Sie einen Platzhalter am Anfang oder Ende des filters, dann können Sie
StartsWith
oderEndsWith
Methoden auf dieString
Klasse, und LINQ-to-Entities werden das unterstützen.Jedoch in diesem Fall, Sie haben eine variable Anzahl von Platzhaltern, so haben Sie, um die Dropdown-Liste, um die ESQL-Ebene und erstellen Sie eine Abfrage aus, die, wie in Nix Antwort.
Können Sie mit einem realen wie im Link zu Entitäten
Hinzufügen
Ihrem EDMX diesem tag:
Erinnern Sie sich auch den namespace in der
<schema namespace="" />
AttributDann fügen Sie eine Erweiterung der Klasse in den oben genannten namespace:
Diese Erweiterung Methode wird nun anzeigen, um die EDMX-Funktion.
Weitere Infos hier: http://jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html
Ich gepostet meine Lösung hier, nur für den Fall, hier ist es zu:
2019 Updates
Für Entity Framework 6.2 können Sie DBFunctions
Beispiel: