Это потому, что вы используете LINQ To Entities , который в конечном итоге преобразует ваши лямбда-выражения в операторы SQL. Это означает, что чувствительность к регистру зависит от вашего SQL Server, который по умолчанию имеет SQL_Latin1_General_CP1_CI_AS Сортировка, и это НЕ чувствительно к регистру.
Использование ObjectQuery.ToTraceString для просмотра сгенерированного запроса SQL, который фактически был отправлен на SQL Server, раскрывает загадку:
string sqlQuery = ((ObjectQuery)context.Thingies
.Where(t => t.Name == "ThingamaBob")).ToTraceString();
Когда вы создаете запрос LINQ to Entities , LINQ to Entities использует синтаксический анализатор LINQ для начала обработки запроса и преобразует его в дерево выражений LINQ. Затем дерево выражений LINQ передается в Object Services API, который преобразует дерево выражений в дерево команд. Затем он отправляется поставщику магазина (например, SqlClient), который преобразует дерево команд в текст команды собственной базы данных. Запрос выполняется в хранилище данных, и результаты Материализованы в Объекты Entity от Объектные службы . Между ними не было заложено никакой логики, чтобы учесть чувствительность к регистру. Поэтому независимо от того, какой случай вы указали в своем предикате, он всегда будет обрабатываться как SQL Server, если вы не измените параметры сортировки SQL Server для этого столбца.
Решение на стороне сервера:
Таким образом, лучшим решением было бы изменить параметры сортировки столбца Name в таблице Thingies на COLLATE Latin1_General_CS_AS , который чувствителен к регистру при запуске этого на вашем сервере SQL:
ALTER TABLE Thingies
ALTER COLUMN Name VARCHAR(25)
COLLATE Latin1_General_CS_AS
Для получения дополнительной информации о шаблонах SQL Server посмотрите SQL-запрос поиска SQL Server с учетом регистра
Клиентское решение:
Единственное решение, которое вы можете применить на стороне клиента, - это использовать LINQ to Objects , чтобы сделать еще одно сравнение, которое не выглядит очень элегантным:
Thingies.Where(t => t.Name == "ThingamaBob")
.AsEnumerable()
.First(t => t.Name == "ThingamaBob");