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

本文关键字:大小写 包含不 框架 LINQ 实体 | 更新日期: 2023-09-27 18:17:56

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

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

到处都是:

  1. 用toUpper()改变两个字符串,或者

  2. 设置不区分大小写的排序规则

然而,这些都不适用于我的情况。这里有一个类似的问题,没有答案:实体框架-不区分大小写包含?

使用第一种方法将获得数据库中的每一行,然后执行toUpper(),以查看是否匹配。这是不可接受的性能方面。

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

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

谁能解释一下为什么会发生这种事,这样我就可以继续我悲惨的生活了?

亲切的问候,罗宾Dorbell

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

这对我来说从来都不是大小写敏感的,但我想这就是我设置数据库的方式。你当然可以使用你的第一种选择,将它们都转换为大写,EF不会把它们拉到内存中去做,只是通知SQL服务器去做。例如:

string searchTerm = "Some Text";
dbcontext.Table.Where (t => t.Column.ToLower().Contains(searchTerm.ToLower()));

生成以下SQL(类似,我使用linqtosql,但EF应该非常相似):

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

从注释中,听起来OP首先将IQueryable列表转换为iccollection,这意味着任何后续的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));

这可能有助于调试问题:我如何查看由实体框架生成的SQL ?

使用字符串。=

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

同样,您不必担心null,只返回您想要的信息。

StringComparision使用。CurrentCulture for区分大小写

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