2015-04-23 12 views
5

Sto tentando di scrivere una clausola dynamic where utilizzando LINQ per restituire tutte le righe che contengono una parola chiave fornita in un array di stringhe. I risultati non tornano come previsto con quello che ho finora e guardando l'SQL posso vedere il problema.Creazione di una clausola dynamic where per le parole chiave dinamiche o utilizzando 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 '~') 

--Se essere

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 '~')) 

Spero che qualcuno mi può aiutare come ho trascorso un paio di ore alla ricerca di una soluzione.

Grazie in anticipo

+1

Qual è il problema e cosa significa: // come utilizzare OR per ciascun array? – MajkeloDev

+0

Si potrebbe voler dare un'occhiata al modello di specifica http://en.wikipedia.org/wiki/Specification_pattern. Una semplice implementazione del modello può essere trovata qui https://github.com/pmacn/Specific –

risposta

3

Come avrete intuito, questa è la parte con il problema che hai bisogno di cambiare, perché sarà "E" tutte le clausole.

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

Penso che si possa fare che cambiando a:

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

Il secondo suggerimento ha funzionato alla grande - grazie! –

+0

Hanno fatto - evviva @Alex –

0

Non so se c'è un modo più pulito, ma cambiare

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

a

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

Any() restituirà un bool se x.text contiene una delle parole chiave nella lista

1

Se stai cercando di costruire il predicato (condizione) in modo dinamico il più semplice e Il modo più flessibile che ho trovato di fare è usare PredicateBuilder.

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

ti dà il pieno controllo su se si utilizza un and o un or per costruire la query.

Problemi correlati