2013-03-12 14 views
10

sto provando a interrogare i miei risultati come questo in linq alle entità;LINQ alle entità contiene ricerca maiuscole/minuscole

var categoriesList = _catRepo.GetAllCategories(); 


filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("for")); 

Tuttavia, non ottengo alcun risultato becuase il CategoryName è For(Upper Case) nel database. Ho anche controllato le regole di confronto del server SQL ed è impostato su _CI_AS. Non ho idea di come usare per filtrare la stringa senza distinzione tra maiuscole e minuscole? Voglio sostanzialmente se qualcuno tipo;

filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("for")); 

O

filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("For")); 

Il risultato dovrebbe essere lo stesso

+3

Questo risponde alla domanda? http://stackoverflow.com/questions/3360772/linq-contains-case-insensitive –

+0

non funziona per me –

+1

Penso che normalmente funzioni con le regole di confronto che dici. Sei sicuro che 'categoriesList' è una query DB e non una query già in memoria (nel qual caso la tua espressione non sarà tradotta in sql). Inoltre, se si tracciano le query db a quel punto, quale SQL viene generato? –

risposta

17

Prova questa

filteredCategories = categoriesList.Where(c=> 
c.CategoryName.IndexOf("for", StringComparison.OrdinalIgnoreCase) >= 0) 

Contiene metodo funziona come mostrato di seguito

public bool Contains(string value) 
{ 
    return this.IndexOf(value, StringComparison.Ordinal) >= 0; 
} 
+2

+1 per l'indice di spiegazione? –

+0

http://msdn.microsoft.com/en-us/library/ms224425.aspx – Shymep

+9

Questo non funzionerà se si lavora direttamente su oggetti EF. Impossibile tradurre 'IndexOf()' – Rufix

6

La risposta IndexOf precedente dovrebbe funzionare. Poiché stai caricando tutte le entità dal database e poi fai un filtro in memoria (da linq a oggetti) su di esso, non stai facendo nulla sul database.

Questo dovrebbe funzionare anche (dal post ho fatto riferimento)

filteredCategories = categoriesList.Where(c=> c.CategoryName.ToLower().Contains("for")); 

Solo una parte, se avete un sacco di categorie, allora si potrebbe desiderare di filtrare loro sulla base di dati, piuttosto che andare a prendere tutto da il db e poi li filtra in memoria ..

+0

Contains chiamerà IndexOf in ogni caso – Shymep

+0

@Shymep Sì, lo so, stavo solo offrendo questo per completezza :) –

+1

Questo non supera il Test della Turchia http://www.moserware.com/2008/02/does -your-code-pass-turkey-test.html – Odys

Problemi correlati