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 ответ
Решение
Решаю эту проблему с таким же изменением:
менять
Key
тип данных дляvarchar
и выполнить 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()