在 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))
编辑
由于人们(可以理解)似乎不阅读评论让我补充一点,这是使用问题的确切代码回答的,其中没有 Where
或 Select
。当然,我知道在执行诸如...
之类的操作时可能会产生巨大的数据开销
DB.Products.AsEnumerable().Where(...).Select(...).OrderBy(...)
...首先将整个 table 内容拉入内存,然后过滤和投影数据库本身可以通过移动 AsEnumerable()
:
来完成
DB.Products.Where(...).Select(...).AsEnumerable().OrderBy(...)
要点是,如果数据库不支持按某些所需字符排序 set/collation,则使用 EF 的 DbSet
的 only 选项就是执行在内存中排序。
另一种方法是 运行 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"));
想象一下这个 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))
编辑
由于人们(可以理解)似乎不阅读评论让我补充一点,这是使用问题的确切代码回答的,其中没有 Where
或 Select
。当然,我知道在执行诸如...
DB.Products.AsEnumerable().Where(...).Select(...).OrderBy(...)
...首先将整个 table 内容拉入内存,然后过滤和投影数据库本身可以通过移动 AsEnumerable()
:
DB.Products.Where(...).Select(...).AsEnumerable().OrderBy(...)
要点是,如果数据库不支持按某些所需字符排序 set/collation,则使用 EF 的 DbSet
的 only 选项就是执行在内存中排序。
另一种方法是 运行 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"));