Question

Items
Code
A
B
C

from x in Items where(x.Code.Contains("a")) select x  //This Linq returns A


from x in Items.ToList() where(x.Code.Contains("a")) select x //This Linq returns nothing

In the second Linq it has become Case Sensitive may i know why and how to overcome this.

Était-ce utile?

La solution

SQL server is case-insensitive using the default collation, so either case will work when the SQL query is executed against the database. When you call ToList(), all the items are fetched from the database and put in a case sensitive List<T>, then the items are filtered. As the List<T> is case-sensitive, it will return false for lowercase values.

You should be using the first code you have, as otherwise in the case of a large table you will have performance issues as you will basically be doing a SELECT * FROM with the second code.

Autres conseils

It's probably because your first query is Linq-To-SQL, so case insensitive, while your second query is Linq-To-Objects, so pure objects with all that comes with it. Then simply do the following:

from x in Items.ToList() where(x.Code.ToLower().Contains("a")) select x

It should do the work.

I assume that this is LINQ-To-SQL or some other LINQ provider that translates it to SQL. The database is case insentitive by default but C# is not. When you call ToList you create an in-memory list. Since x.Code seems to be a String you are using String.Contains which looks for sub-strings case-sensitive.

You can use String.IndexOf with StringComparison.OrdinalIgnoreCase if you want:

from x in Items.ToList() 
where(x.Code.IndexOf("a", StringComparison.OrdinalIgnoreCase) >= 0) 
select x 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top