实体框架LINQ不包含不区分大小写

时间:2014-08-14 14:34:58

标签: c# sql-server asp.net-mvc linq entity-framework

我有一些'撕掉我的头发' - 实体框架的问题,我找不到解决方案。

我想要做的是比较我在服务器上运行的搜索功能的字符串。它基本上是:collection.Where(c => c.Name.Contains(searchTerm));其中searchTerm是用户传递的字符串。

我到处都看到了:

  1. 使用toUpper()或

  2. 更改两个字符串
  3. 将排序规则设置为不区分大小写。

  4. 然而,这些都不适用于我的情况。这是一个类似的问题,没有答案:Entity Framework - case insensitive Contains?

    使用第一个替代方法将导致获取数据库中的每一行,然后执行toUpper(),以查看它是否匹配。这在性能方面是不可接受的。

    第二种方法似乎更有可能是一种有效的解决方案,但由于某些原因不起作用。我有两个数据库。一个本地和一个远程。远程MSSQL数据库设置为排序规则:Finnish_Swedish_CI_AS,这意味着它不区分大小写?本地数据库是一个自动生成的localDB,其属性“Case Sensitive”设置为False。

    无论我使用这两个数据库中的哪一个,对用户来说仍然总是区分大小写。

    有人可以解释为什么会这样,所以我可以继续我悲惨的生活吗?

    亲切的问候, 罗宾多尔贝尔

3 个答案:

答案 0 :(得分:12)

对我来说,它从来都不是区分大小写,但我想这就是我设置数据库的方式。你绝对可以使用你的第一个选项将它们转换为大写,EF不会将它们拉入内存来执行此操作,只需通知SQL服务器即可。例如:

string searchTerm = "Some Text";

dbcontext.Table.Where (t => t.Column.ToLower().Contains(searchTerm.ToLower()));

生成以下SQL(ish,我用linqtosql做了这个,但EF应该非常相似):

-- Region Parameters
DECLARE @p0 NVarChar(1000) = '%some text%'
-- EndRegion
SELECT *
FROM [Table] AS [t0]
WHERE LOWER([t0].[Column]) LIKE @p0

答案 1 :(得分:11)

从评论中,听起来OP首先将IQueryable列表转换为ICollection,这意味着任何后续LINQ都在“本地”运行,而不是有机会转换为SQL。

例如,

    // Should be IQueryable<T>
    ICollection<User> users = context.Users;

    // This is executed in code rather than SQL, and so is case SENSITIVE
    users = users.Where(c => c.Name.Contains(searchTerm));

这可能有助于调试问题:How do I view the SQL generated by the entity framework?

答案 2 :(得分:-1)

使用string.Equals

collection.Where(c => string.Equals(c.Name, searchTerm, StringComparison.CurrentCultureIgnoreCase));

此外,您不必担心null并只返回您想要的信息。

对区分大小写使用StringComparision.CurrentCulture。

collection.Where(c => string.Equals(c.Name, searchTerm, StringComparison.CurrentCulture));