Entity Framework Запрос с учетом регистра

У меня есть таблица с именем Post который имеет столбец с именем key:

  Id | Key | Title
 --------------------
   1 | WM  | First
 --------------------
   2 | wm  | Second

Как вы можете видеть первый key значение Post является WM (Прописные) и второй key значение wm (В нижнем регистре).

Когда я выполняю запрос со следующим кодом:

var post = await _posts.Where(o => o.Key == key).Select(o => new
    {
        id = o.Id,
        title = o.Title
    }).SingleOrDefaultAsync();

Я передаю key со значением (WM и WM), но получить один результат. Второй (wm).

Я искал решение и нашел этот вопрос и этот ответ. После того, как я попытался использовать ответ и реализовать [CaseSensitive] аннотация данных, когда я ищу wm Я получаю первый пост и когда ищу WM я получил null, Как я могу решить эту проблему и получить адекватный пост с ключом?

Обновление: сгенерированный SQL-запрос:

   SELECT [Limit1].[C1]    AS [C1],
       [Limit1].[Id]    AS [Id],
       [Limit1].[Title] AS [Title]
FROM   (SELECT TOP (2) [Extent1].[Id]    AS [Id],
                       [Extent1].[Title] AS [Title],
                       1                 AS [C1]
        FROM   [dbo].[Posts] AS [Extent1]
        WHERE  ([Extent1].[Key] = 'wm' /* @p__linq__0 */)
                OR (([Extent1].[Key] IS NULL)
                    AND ('wm' /* @p__linq__0 */ IS NULL))) AS [Limit1]

1 ответ

Решение

Решаю эту проблему с таким же изменением:

  1. менять Key тип данных для varchar

  2. и выполнить SQL-запрос с SqlQuery<T>:

    var post = await _uow.Database
                .SqlQuery<PostUrlDto>(
                    "SELECT Id , Title FROM Posts WHERE [Key] = @postkey COLLATE SQL_Latin1_General_CP1_CS_AS",
                    new SqlParameter("postkey", postkey)).SingleOrDefaultAsync()
    
Другие вопросы по тегам