SQL to Entities - 无法使'String.Contains'返回'case-INSENSITIVE'结果

时间:2012-08-18 10:27:24

标签: sql-server linq-to-entities collation

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

它连接的数据库是MS SQL 2012。 数据库整理是'希伯来语CI'。

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

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

它不会使用'John'的'FirstName'获取记录。只有姓名为'john'的人才能

我认为这是由SQL Server端通过数据库整理确定的,但显然我错了......

另外 - 我检查了'FirstName'列的排序规则,并将其设置为'Database Default'。

我在这里缺少什么?

[更新]

在阅读了一些评论之后 - 我需要澄清一下:

我正在使用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()'时,查询才真正触发所有过滤器。

3 个答案:

答案 0 :(得分:1)

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

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

IEnumerable<User>

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

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

答案 1 :(得分:0)

以下是实现此目的的一种方法:

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

答案 2 :(得分:0)

如果这个linq被映射到sql,它将使用sql server设置......但在你的情况下,users已经是一个对象列表(否则你的字符串比较将依赖于数据库服务器),所以你可以做这样的事情:

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