2012-03-23 13 views

Odpowiedz

11

Spróbuj tego:

q => q.Where(entity => entity.CaseInsensitiveField.ToUpper() == DesiredField.Trim().ToUpper()) 

Również chciałbym zaproponować, aby ustawić parametr poza zapytania:

var value = DesiredField.Trim().ToUpper(); 

... 

q => q.Where(entity => entity.CaseInsensitiveField.ToUpper() == value) 
+0

to będzie przetłumaczone poprawnie? –

+0

Tak będzie, ponieważ metoda ToUpper() zostanie przetłumaczona jako UPPER (pole) w zapytaniu SQL. –

+0

ivowiblo: Pokornie przyznaję, że masz rację, moja metoda ContainsLike nie zostanie przetłumaczona na SQL. Proszę zobaczyć mój komentarz do mojej odpowiedzi dla dalszych szczegółów. Dzięki tobie, z całą moją pokorą. –

4

Użyj tego:

q => q.Where(entity => 
    String.Equals(entity.CaseInsensitiveField , CaseInsensitiveField , 
        StringComparison.OrdinalIgnoreCase)); 

UPDATE

Wydaje się (przynajmniej przez LINQPad), że powyższe nie przełoży się na SQL, więc proponuję, jak ivowiblo już zaproponował:

var comparisonValue = CaseInsensitiveField.ToUpper(); 
q => q.Where(entity => 
    entity.CaseInsensitiveField.ToUpper() == comparisonValue); 

Powodem ustawienia ToUpper wcześniej jest to, że funkcje proceduralne są ogólnie se w SQL, a ponieważ nie jest to pole bazy danych, możemy wysłać je już w postaci wielkiej litery.

+0

+1 Nice one, nie wiedziałem o tym! Dzięki za udostępnienie! –

+0

String.Equals będzie poprawnie przetłumaczony? –

+0

'string.Equals' lub" entity.CaseInsensitiveField == 'są takie same, więc tak jest tłumaczone jako proste porównanie, tak jak ty. –

Powiązane problemy