我有一个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()'时,查询才真正触发所有过滤器。
答案 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));