Использование сопоставления в Linq to Sql
Представьте себе этот SQL-запрос
select * from products order by name collate Persian_100_CI_AI asc
Теперь с помощью Linq:
product = DB.Products.OrderBy(p => p.name); // what should I do here?
Как я могу применить сопоставление?
3 ответа
Решение
Теперь это возможно в EF Core 5.0 с помощью функции сопоставления .
В вашем примере код может быть:
product = DB.Products.OrderBy(p => EF.Functions.Collate(p.name, "Latin1_general_CI_AI"));
Прямого пути нет. Временное решение:
Создать функцию в Sql Server
CREATE FUNCTION [dbo].[fnsConvert]
(
@p NVARCHAR(2000) ,
@c NVARCHAR(2000)
)
RETURNS NVARCHAR(2000)
AS
BEGIN
IF ( @c = 'Persian_100_CI_AI' )
SET @p = @p COLLATE Persian_100_CI_AI
IF ( @c = 'Persian_100_CS_AI' )
SET @p = @p COLLATE Persian_100_CS_AI
RETURN @p
END
Импортируйте его в модель и используйте:
from o in DB.Products
orderby DB.fnsConvert(s.Description, "Persian_100_CI_AI")
select o;
Вы не можете изменить параметры сортировки с помощью оператора LINQ. Вы лучше выполните сортировку в памяти, применяя StringComparer
это инициализируется с правильной культурой (по крайней мере... я надеюсь, что это правильно) и игнорирует регистр (true
).
DB.Products.AsEnumerable()
.OrderBy (x => x, StringComparer.Create(new CultureInfo("fa-IR"), true))