开发者

How can I get .ToUpper() (or the equivalent) to work when using .Contains() in Linq to Sql?

This code:

keyword = 's';
IEnumerable<Member> searchResults = 
        (from m in members
         where m.ScreenName.ToUpper().Contains(keyword.ToUpper())
         select m).AsEnumerable();

Only returns records that have an uppercase 'S' in the ScreenName. Why is m.Scr开发者_如何学JAVAeenName.ToUpper() being ignored? How do I convert m.ScreenName to uppercase so I can perform case-insensetive checks?

Edit

This is not a duplicate. I attempted the solution in the proposed duplicate:

IEnumerable<Member> searchResults = 
       (from m in members
        where m.ScreenName.Contains(keyword, StringComparison.OrdinalIgnoreCase)
        select m).AsEnumerable();

This failed. StringComparison.OrdinalIgnoreCase is not a valid parameter for .Contains().


There is no way (AFAIK) to specify case sensitivity/insensitivity explicitly via Linq-to-SQL.

I would recommend modifying your database schema to use a case-insensitive collation on the column(s) you're searching.

SQL Server collation settings control things like case sensitivity, accent sensitivity (is 'cafe' the same as 'café' ?), and the rules used to perform string comparison and sorting.

Collations are selected from a list built in to SQL Server, and most of them will be called something like SQL_Latin1_General_CP1_CI_AI

The last two pairs of characters are the important bit - CI_AI means case-insensitive, accent-insensitive. I suspect you'll find the the collation on the ScreenName column is set to something like CS_AI or CS_AS. Change this, and your query should work correctly.


AFAIR string comparison in SQL is case insensitive itself.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜