【发布时间】:2020-03-24 12:44:05
【问题描述】:
我想问一个关于 SQL Server 和 EF Core 的问题。数据库中的排序规则是Latin1_CI_AS,我想编写一个包含土耳其字符的搜索查询。
在数据库中,'personnel' 表中有一条名为“SELİM”的记录。当我在 EF Core 中编写这样的查询时:
public async Task<IList<PersonnelGetDto>> Get(PersonnelGetPayload payload)
{
if (payload.Name != null)
query = query.Where(x => x.Name.Contains(payload.Name));
}
如果我的搜索条件是“selim”,则列表为空。
我没有机会将数据库中的排序规则更改为土耳其语,因为我们的应用程序是多语言的。我认为其他语言会有问题。还是我错了?
我还写了字符串扩展。但是,在将 LINQ 查询转换为 SQL 时,所有记录都会到达服务层,因为 LIKE 运算符没有分配 WHERE 子句。在 sql 端运行这个条件非常重要。如果我把所有的数据集都拿到服务层去查询,那会花费我很多。
当我像这样在数据库中键入查询时,我可以解决问题:
SELECT * FROM Personnel WHERE Name LIKE 'selim' COLLATE Turkish_CI_AS
我想如果我可以在 EF Core 上操作整理,我会解决这个问题。
【问题讨论】:
-
不,不是这个。因为 İ 和 i 是不同的字母。我尝试了这个解决方案,但没有奏效。
-
是否使用
indexOf选项?query = query.Where(x => x.Name.IndexOf(payload.Name, StringComparison.OrdinalIgnoreCase)); -
当我实现这个时,我得到了这个错误:“无法将类型'int'隐式转换为'bool'”和“无法将lambda表达式转换为预期的委托类型,因为块中的一些返回类型不能隐式转换为委托返回类型”
-
...Where(x =>x.Name.IndexOf(payload.Name, StringComparison.OrdinalIgnoreCase) > -1)
标签: c# sql-server .net-core entity-framework-core case-insensitive