Использование сопоставления в 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))
Другие вопросы по тегам