1

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

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

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

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

它不会获取具有'John' 的'FirstName' 的记录。只有名字是 'john' 的

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

另外 - 我检查了“名字”列的排序规则,并将其设置为“数据库默认值”。

我在这里想念什么?

.

[ 更新 ]

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

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

4

3 回答 3

1

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

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

IEnumerable<User>

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

编译时类型必须是IQueryable<User>.

于 2012-08-18T10:29:32.730 回答
0

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

return users.Where(us => us.FirstName.Contains("joh", StringComparer.OrdinalIgnoreCase));
于 2012-08-18T13:04:10.183 回答
0

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

return users.Where(us => us.FirstName.ToLower().Contains("joh"));
于 2012-08-18T10:29:01.840 回答