Linq to Entities (EF 4.1): Wie man eine SQL LIKE mit einer wildcard in der Mitte ( '%Begriff%Begriff%')?
Möchte ich die Suche für diese:
Post Cereal
bekommen und diese:
Post Honey Nut Cereal
wo die wilden Karten wäre der Räume.
Ich weiß, ich könnte tun, eine Spaltung und eine Reihe von ANDs und Contains() und übersetzung zu einem Linq-Ausdruck für jeden Begriff als eine Objekt-Spezifikation, aber gibt es nicht eine Möglichkeit, zu Ehren von wildcards in den Begriff an SQL? Ich schaute auf SQL-Funktionen, wo es in Linq to SQL, aber ich bin nicht sicher, was es ist in Linq to Entities.
Ich würde gerne etwas wie das hier tun:
term = '%' + term.Replace(' ', '%') + '%';
db.table.where( p => System.Data.Objects.SqlClient.SqlFunctions
.SqlMethods.Like(p.fieldname, term) );
Irgendwelche Vorschläge?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie könnte verwenden SqlFunctions.PatIndex:
SqlFunctions.PatIndex verhält sich ähnlich wie der SQL LIKE Betreiber. Es unterstützt alle standard-Platzhalter-Zeichen, einschließlich:
SqlFunctions.PatIndex ist Häufig vorhanden, wenn der SqlMethods.Wie nicht erhältlich (auch innerhalb von MVC-Controllern)
SqlFunctions.PatIndex
wird nicht unterstützt in EF 4.0 - ich bekomme eine Ausnahme nicht unterstützt.Ist es wahrscheinlich einfacher zu umgehen, LINQ und Nutzung einer Entity SQL-filter:
und die Art der
query
implementiertIQueryable<TEntity>
so können Sie weitere LINQ-Operatoren.EntitySqlException: 'BusinessName' could not be resolved in the current scope or context. Make sure that all referenced variables are in scope, that required schemas are loaded, and that namespaces are referenced correctly.
Wo "BusinessName" ist die Spalte, die ich bin versucht zu filtern. Kann nicht herausfinden, wie man in der Vergangenheit dieser.it.BusinessName
. Spalten in ESQL muss vorangestellt werden undit
ist der Standard-Präfix - hier ist voll Beispiel für die Abfrage.Genau zu klären, Ladislav Kommentar zur
it.BusinessName
. Ich denke was er meint ist, indem der name des Feldes mit.it
. Die obige Lösung funktioniert so lange, wie Sie das Präfix der Feldnamen in der where-Klausel mitit.
. Auch brauchte ich nicht die TRIM() in meinem Fall.Es funktionierte perfekt für eine Oracle-Datenbank.