如何使用Server 2008 R2和EF 6进行重音不敏感的搜索查询?
我需要使用实体框架6对user.name
列进行重音不敏感的搜索,我尝试将列上的排序规则从默认的Czech_CI_AS
更改为Czech_CI_AI
。但它不适用于一些带有楔形的捷克字母,比如Č,Ř,Š,Ž,因为排序规则将它们视为不同的字母:
AI.html
我在这里发现了类似的问题:
How do I perform an accent insensitive compare in SQL Server for 1250 codepage
但是所建议的使用排序规则Czech_100_CI_AI
的解决方案也不起作用(对于那些特殊的字母)。
我也发现了很少的资料来源,如何在普通的T中做这件事。如下所示:
SELECT *
FROM [dbo].[User]
WHERE name LIKE '%c%' COLLATE Latin1_General_CI_AI
效果很好。但是我不想使用普通的SQL查询。我想用EF的方式来管理它。
发布于 2018-02-20 15:41:57
我最终得到了这样的解决方案:
创建带有两列的视图--一列用于搜索,第二列用于表示(拉丁排序规则将从结果中删除一些重音)。
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上下文中的视图创建DB映射。
在EF中使用FirstNameCI
列进行搜索。
if (!string.IsNullOrWhiteSpace(filter.FirstName))
query = query.Where(x => x.c.FirstNameCI.StartsWith(filter.FirstName));
使用FirstName
列表示。
发布于 2018-02-20 15:53:48
在实体框架中,当您在Contains()
中的where()
扩展方法中使用IQueryable
方法时,它将被转换为带有like
操作符的where
子句。所以我想这就是你要找的。您可以参考this SO question。
https://stackoverflow.com/questions/48888969
复制相似问题