2015-04-23 10 views
5

Próbuję napisać dynamiczną klauzulę where używając LINQ do zwrócenia wszystkich wierszy zawierających dowolne słowo kluczowe dostarczone w tablicy łańcuchowej. Rezultaty nie wracają zgodnie z oczekiwaniami z tego, co do tej pory miałem i patrząc na SQL, widzę problem.Tworzenie dynamicznego klauzula where dla dynamicznych słów kluczowych lub przy użyciu IQueryable C# Linq

IQueryable<comments> query = _db.comments; 

if (score != null) 
    query = query.Where(x => x.score == score); 
if (dateFrom != null)3 
    query = query.Where(x => x.date_created >= dateFrom); 
if (dateTo != null) 
    query = query.Where(x => x.date_created <= dateTo); 
if (keywords != null) 
{ 
    //how to use OR for each in array? 
    foreach (var keyword in keywords) 
    { 
     var keywordCondition = keyword; 
     query = query.Where(x => x.text.Contains(keywordCondition)); 
    } 

} 

WHERE ([Extent1].[score] = @p__linq__0) 
AND ([Extent1].[date_created] >= @p__linq__1) 
AND ([Extent1].[date_created] <= @p__linq__2) 
AND ([Extent1].[text] LIKE @p__linq__3 ESCAPE '~') 
AND ([Extent1].[text] LIKE @p__linq__4 ESCAPE '~') 

--should być

WHERE ([Extent1].[score] = @p__linq__0) 
AND ([Extent1].[date_created] >= @p__linq__1) 
AND ([Extent1].[date_created] <= @p__linq__2) 
AND (([Extent1].[text] LIKE @p__linq__3 ESCAPE '~') 
    OR ([Extent1].[text] LIKE @p__linq__4 ESCAPE '~')) 

Mam nadzieję, że ktoś może mi pomóc jak spędziłem kilka godzin teraz poszukiwania rozwiązania.

góry dzięki

+1

Co to jest problem i co to znaczy: // jak używać operatora OR dla każdego w tablicy? – MajkeloDev

+0

Możesz chcieć rzucić okiem na wzór specyfikacji http://en.wikipedia.org/wiki/Specification_pattern. Prostą implementację wzorca można znaleźć tutaj https://github.com/pmacn/Specific –

Odpowiedz

3

Jak można się domyślić, jest to część z problemem, że trzeba będzie zmienić, bo to będzie „i” wszystkich klauzul.

//how to use OR for each in array? 
foreach (var keyword in keywords) 
{ 
    var keywordCondition = keyword; 
    query = query.Where(x => x.text.Contains(keywordCondition)); 
} 

myślę, że można to zrobić, zmieniając go do:

query = query.Where(x => keywords.Any(kw => x.text.Contains(kw)); 
+0

Druga sugestia działała świetnie - dziękuję! –

+0

Pozdrawiam - okrzyki @Alex –

0

Nie wiem, czy istnieje czystszy sposób, ale zmiana

foreach (var keyword in keywords) 
    { 
     var keywordCondition = keyword; 
     query = query.Where(x => x.text.Contains(keywordCondition)); 
    } 

do

query = query.Where(x => keywords.Any(k => x.text.Contains(k)); 

Any() powróci bool jeśli x.text Zawiera którekolwiek ze słów kluczowych na liście

1

Jeśli próbujesz zbudować predykat (warunek) to najprostszy i dynamicznie najbardziej elastycznym sposobem, jaki znalazłem, jest użycie PredicateBuilder.

http://www.albahari.com/nutshell/predicatebuilder.aspx

To daje pełną kontrolę nad tym, czy używasz and lub or budować zapytania.

Powiązane problemy