我有一些'撕掉我的头发' - 实体框架的问题,我找不到解决方案 .
我想要做的是比较搜索函数I 'm running on the server. It' s的字符串: collection.Where(c => c.Name.Contains(searchTerm));
其中searchTerm是用户传递的字符串 .
到处都看,它是:
-
使用toUpper()更改两个字符串,或
-
将排序规则设置为不区分大小写 .
然而,这些都不适用于我的情况 . 这里's a similar question which doesn'有一个答案:Entity Framework - case insensitive Contains?
使用第一个替代方法将导致获取数据库中的每一行,然后执行toUpper(),以查看它是否匹配 . 这在性能方面是不可接受的 .
第二种方法似乎更有可能是一种有效的解决方案,但由于某些原因不起作用 . 我有两个数据库 . 一个本地和一个远程 . 远程MSSQL数据库设置为排序规则:Finnish_Swedish_CI_AS,这意味着它不区分大小写?本地数据库是一个自动生成的localDB,其属性“Case Sensitive”设置为False .
无论我使用它的这两个数据库中的哪一个,对用户来说仍然总是区分大小写 .
有人可以解释为什么会这样,所以我可以继续我悲惨的生活吗?
亲切的问候,罗宾多尔贝尔
3 回答
从评论中,听起来OP首先将IQueryable列表转换为ICollection,这意味着任何后续LINQ都在“本地”运行而不是有机会转换为SQL .
例如,
这可能有助于调试问题:How do I view the SQL generated by the entity framework?
它对我来说从未区分大小写,但我想这就是我如何设置数据库 . 你绝对可以使用你的第一个选项将它们转换为大写,EF不会将它们拉入内存来执行此操作,只需通知SQL服务器即可 . 例如:
生成以下SQL(ish,我用linqtosql做了这个,但EF应该非常相似):
使用string.Equals
此外,您不必担心null并且只返回您想要的信息 .
对于区分大小写,请使用StringComparision.CurrentCulture .