2015-04-16 12 views
6

Możemy użyć metody .Contains(string) w wyrażeniu LINQ, która brzmi jak "% tekst wyszukiwania%", metoda .StartsWith(string), która brzmi jak "tekst wyszukiwania%" i metoda .EndsWith(string), która brzmi jak "% tekstu wyszukiwania".Zapytanie Linq gdzie() SQL% odpowiednik

Potrzebuję jednak czegoś, co brzmi "% search% text%", który znajdzie wszystkie treści zawierające "wyszukiwanie" i "tekst", ale nie sekwencyjne.

Przykład: Mam te rekordy:

wyszukiwać mój tekst

poszukiwania tekstu

Szukajcie tekst

W SQL, zapytanie o LIKE '%search%text%' przynosi:

wyszukiwania mój tekst

wyszukiwania dla tekstu

Ale nie przynosi 'seek the text'.

Wszelkie pomysły?

+2

Użyj wyrażeń regularnych: zamień '%' na '. *' I '_' na' .' – zerkms

+4

Czy to działa? '.Contains (" search "). Zawiera (" tekst ")' może być kilka błędów składniowych w moim kodzie, ale mam nadzieję, że wpadniesz na mój pomysł. – Turtle

+0

Czy używasz LINQ dla obiektów lub LINQ-SQL? – Blorgbeard

Odpowiedz

7

Można użyć jednej metody pomocnika:

var result = from o in ctx.table 
where SqlMethods.Like(o.column, "%search%text%") 
select o.column; 
0

można użyć coś takiego:

var rx = new Regex("search.*text", RegexOptions.IgnoreCase); 
List<string> lists=new List<string>(){"search text","search this text","search my book"}; 
var result = lists.Where(x => rx.IsMatch(x)); 

Jeżeli uzyskanie wkładu w postaci „szukaj% tekst” możesz po prostu napisać "%" zamiast ". *" i używać jako wzoru Reg ex.

+1

Nie można używać wyrażeń regularnych z linq do sql. Najpierw musisz wybrać wszystkie dane w pamięci, a następnie filtrować za pomocą wyrażenia regularnego, które jest nieefektywne w porównaniu do podobnej funkcji, która będzie filtrować dane w warstwie sql i zwracać już przefiltrowane dane. –

+0

Co masz na myśli? Mogę łatwo zrobić: 'od x na listach gdzie rx.IsMatch (x) wybierz x;', Jeśli mówisz o filtrowaniu w przypadku linq do sql, to tak, masz rację, kod filtruje w pamięci vs filtrowanie w samym serwerze sql, jednak istnieje inny narzut na używanie linq do sql. – ANewGuyInTown

+0

Mam na myśli, że jeśli masz miliard wierszy i chcesz filtrować tylko 10 wierszy, najpierw musisz załadować te miliardy wierszy do pamięci, co jest dużym obciążeniem. –

Powiązane problemy