使用 EF6 和 SQL Server 2008 R2 进行不区分重音的搜索 - 捷克语

问题描述 投票:0回答:2

如何使用 SQL Server 2008 R2 和 EF 6 进行不区分重音的搜索查询?

我需要使用实体框架 6 对

user.name
列进行不区分重音的搜索。我尝试将列上的排序规则从默认的
Czech_CI_AS
更改为
Czech_CI_AI
。但它不适用于一些带有楔形的捷克语字母,例如 Č、Ř、Š、Ž,因为排序规则将它们视为不同的字母:

http://collation-charts.org/mssql/mssql.0405.1250.Czech_CI_AI.html

我在这里发现了类似的问题:

如何在 SQL Server 中针对 1250 代码页执行不区分重音的比较

但是使用排序规则的建议解决方案

Czech_100_CI_AI
也不起作用(对于那些特殊字母)。

我还发现了一些如何在普通 T-SQL 中执行此操作的来源。像这样:

SELECT * 
FROM [dbo].[User] 
WHERE name LIKE '%c%' COLLATE Latin1_General_CI_AI

效果很好。但我不想使用普通的 SQL 查询。我想用 EF 的方式来管理它。

c# sql-server entity-framework sql-server-2008-r2 entity-framework-6
2个回答
3
投票

我最终得到了这个解决方案:

创建包含两列的视图 - 一列用于搜索,第二列用于演示(拉丁排序规则将从结果中删除一些重音符号)。

CREATE VIEW [dbo].[v_UserSearch]
AS
SELECT    
           dbo.[User].name AS FirstName,
           dbo.[User].name COLLATE Latin1_General_CI_AI AS FirstNameCI
FROM       dbo.[User]  

为 EF 上下文中的视图创建数据库映射。

使用

FirstNameCI
列在 EF 中进行搜索。

if (!string.IsNullOrWhiteSpace(filter.FirstName))
   query = query.Where(x => x.c.FirstNameCI.StartsWith(filter.FirstName));

使用

FirstName
栏进行演示。


1
投票

在实体框架中,当您在

Contains()
中的
where()
扩展方法中使用
IQueryable
方法时,它会被转换为SQL中带有
where
运算符的
like
子句。所以我想这就是您正在寻找的。你可以参考这个SO问题

© www.soinside.com 2019 - 2024. All rights reserved.