使用EF6和SQL Server 2008 R2进行重音不敏感搜索 - 捷克语

时间:2018-02-20 15:41:58

标签: sql-server entity-framework tsql sql-server-2008-r2 entity-framework-6

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

我需要使用Entity框架6对我们说user.name列进行重音不敏感搜索。我尝试将列上的排序规则从默认Czech_CI_AS更改为Czech_CI_AI。但它不适用于一些捷克字母,如Č,Ř,Š,Ž,因为整理将它们视为不同的字母:

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

我在这里找到了类似的问题:

How do I perform an accent insensitive compare in SQL Server for 1250 codepage

但是使用排序规则Czech_100_CI_AI的建议解决方案也不起作用(对于那些特殊字母)。

我还发现了一些如何在普通T-SQL中完成它的来源。像这样:

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

工作正常。但我不想使用纯SQL查询。我想以EF方式管理它。

2 个答案:

答案 0 :(得分:2)

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

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

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 :(得分:1)

在实体框架中,当您在Contains()中的where()扩展方法中使用IQueryable方法时,在SQL中将where子句转换为like运算符。所以我想这就是你在寻找什么。您可以参考this SO question