在 Linq 中使用排序规则 Sql

Using collation in 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?

如何应用排序规则?

您不能通过 LINQ 语句更改排序规则。你最好通过应用一个 StringComparer 来在内存中进行排序,该 StringComparer 用正确的文化初始化(至少......我希望它是正确的)并忽略大小写(true)。

DB.Products.AsEnumerable()
  .OrderBy (x => x, StringComparer.Create(new CultureInfo("fa-IR"), true))

编辑

由于人们(可以理解)似乎不阅读评论让我补充一点,这是使用问题的确切代码回答的,其中没有 WhereSelect。当然,我知道在执行诸如...

之类的操作时可能会产生巨大的数据开销
DB.Products.AsEnumerable().Where(...).Select(...).OrderBy(...)

...首先将整个 table 内容拉入内存,然后过滤和投影数据库本身可以通过移动 AsEnumerable():

来完成
DB.Products.Where(...).Select(...).AsEnumerable().OrderBy(...)

要点是,如果数据库不支持按某些所需字符排序 set/collation,则使用 E​​F 的 DbSetonly 选项就是执行在内存中排序。

另一种方法是 运行 SQL 查询具有 ORDER BY 和显式排序规则。如果使用分页,这是唯一的选择。

没有直接的方法。 解决方法:

在 Sql 服务器中创建函数

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;

现在可以使用 EF Core 5.0 使用 collate 函数。

在您的示例中,代码为:

product = DB.Products.OrderBy(p => EF.Functions.Collate(p.name, "Persian_100_CI_AI"));