我有一个执行"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));