SQL 到实体 - 无法使'String.Contains'返回'case-INSENSITIVE'结果



我有一个执行"LINQ to Entities"查询的C#应用程序。

它连接到的数据库是MS SQL 2012。数据库排序规则为"希伯来语 CI"。

仍然 - 如果我执行如下查询:

return users.Where(us => us.FirstName.Contains("joh"));

它不会获取带有"John"的"名字"的记录。只有那些名字为"约翰"的人。

以为这是由数据库排序规则在SQL服务器端确定的,但显然我错了......

另外 - 我已经检查了"名字"列的排序规则,它设置为"数据库默认值"。

我在这里错过了什么?

.

[ 更新 ]

阅读一些评论后 - 我需要澄清:

我使用的是 LINQ-TO-ENTITIES,而不是本地查询。

完整的代码段是:

public List<User>   GetUsersByName(IMyDBEntities context, String filterBy)
{
    IEnumerable<User> users = context.Users;
    return users.Where(us => us.FirstName.Contains("filterBy"));  // filterBy = 'joh'
}

完整功能包含更多过滤器(按年龄过滤,按地址过滤等)

这一切都发生在"服务器"用户列表中,并且只有当我这样做时。ToList()' 查询是否实际与所有过滤器一起触发。

很可能,您正在对本地集合执行此 Where 调用,这意味着您将获得 LINQ to Objects 语义。您需要将其移动到数据库查询。

看到更新的代码,问题很明显:

IEnumerable<User>

通过将序列变量声明为局部序列而不是查询,可以使编译器使用本地查询运算符,而不是远程查询运算符。

编译时类型必须为 IQueryable<User>

这是实现此目的的一种方法:

return users.Where(us => us.FirstName.ToLower().Contains("joh"));

如果这个 linq 映射到 sql,它将使用 sql 服务器设置...但在您的情况下,users已经是一个对象列表(否则您的字符串比较将依赖于数据库服务器),因此您可以执行以下操作:

return users.Where(us => us.FirstName.Contains("joh", StringComparer.OrdinalIgnoreCase));

最新更新