Próbujemy zaimplementować operator „LIKE” w Entity Framework dla naszych jednostek z polami ciągów, ale wygląda na to, że nie jest obsługiwany. Czy ktoś inny próbował zrobić coś takiego?
W tym poście na blogu podsumowano występujący problem. Moglibyśmy użyć zawiera, ale to pasuje tylko do najbardziej trywialnego przypadku LIKE. Łączenie zawiera, zaczyna się, kończy się i indeksuje, ale wymaga tłumaczenia między standardowymi symbolami wieloznacznymi a kodem Linq na kod Entities.
Odpowiedzi:
To jest teraz stary post, ale każdemu, kto szuka odpowiedzi, ten link powinien pomóc. Przejdź do tej odpowiedzi, jeśli używasz już EF 6.2.x. Do tej odpowiedzi, jeśli używasz EF Core 2.x
Krótka wersja:
Metoda SqlFunctions.PatIndex - zwraca pozycję początkową pierwszego wystąpienia wzorca w określonym wyrażeniu lub zer, jeśli wzorzec nie zostanie znaleziony, we wszystkich poprawnych typach danych tekstowych i znakowych
Przestrzeń nazw: System.Data.Objects.SqlClient Assembly: System.Data.Entity (w System.Data.Entity.dll)
W tym wątku na forum pojawia się też trochę wyjaśnienia .
źródło
Tak naprawdę nie wiem nic o EF, ale w LINQ to SQL zwykle wyrażasz klauzulę LIKE za pomocą String.
przetłumaczyć na
(Użyj
StartsWith
iEndsWith
do innego zachowania.)Nie jestem do końca pewien, czy to jest pomocne, ponieważ nie rozumiem, co masz na myśli, mówiąc, że próbujesz wdrożyć LIKE. Jeśli kompletnie źle zrozumiałem, daj mi znać, a usunę tę odpowiedź :)
źródło
Miałem ten sam problem.
Na razie zdecydowałem się na filtrowanie Wildcard / Regex po stronie klienta w oparciu o http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx - to proste i działa jak spodziewany.
Znalazłem inną dyskusję na ten temat: http://forums.asp.net/t/1654093.aspx/2/10
Ten post wygląda obiecująco, jeśli używasz Entity Framework> = 4.0:
Uwaga: to rozwiązanie jest przeznaczone tylko dla SQL-Server, ponieważ używa niestandardowej funkcji PATINDEX.
źródło
Aktualizacja: W EF 6.2 jest operator Like
źródło
Where(obj => DbFunctions.Like(obj.Column , "%expression%")
?Istnieje
LIKE
operatora dodaje sięEntity Framework Core 2.0
:var query = from e in _context.Employees where EF.Functions.Like(e.Title, "%developer%") select e;
W porównaniu do
... where e.Title.Contains("developer") ...
tego jest naprawdę przetłumaczone na,SQL
LIKE
aCHARINDEX
nie widzimyContains
metody.źródło
Jest to wyraźnie wymienione w dokumentacji jako część Entity SQL. Czy otrzymujesz komunikat o błędzie?
// LIKE and ESCAPE // If an AdventureWorksEntities.Product contained a Name // with the value 'Down_Tube', the following query would find that // value. Select value P.Name FROM AdventureWorksEntities.Product as P where P.Name LIKE 'DownA_%' ESCAPE 'A' // LIKE Select value P.Name FROM AdventureWorksEntities.Product as P where P.Name like 'BB%'
http://msdn.microsoft.com/en-us/library/bb399359.aspx
źródło
jeśli używasz MS Sql, napisałem 2 metody rozszerzające, które obsługują znak% dla wyszukiwania wieloznacznego. (Wymagany jest LinqKit)
stosowanie
w ef6 i powinno się to przekładać na
', @ p__linq__0 ='% He% llo% ', @ p__linq__1 ='% Hi% ', @ p__linq_2 ='% Active '
źródło
Dla EfCore tutaj jest przykład do zbudowania wyrażenia LIKE
źródło
Możesz dość łatwo użyć prawdziwego polubienia w Link to Entities
Dodaj
do twojego EDMX w tym tagu:
Pamiętaj również o przestrzeni nazw w
<schema namespace="" />
atrybucieNastępnie dodaj klasę rozszerzenia w powyższej przestrzeni nazw:
Ta metoda rozszerzenia będzie teraz mapowana na funkcję EDMX.
Więcej informacji tutaj: http://jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html
źródło