当前位置: 首页 > 编程语言 > C#

Linq to Entities:在NText字段上使用ToLower()分享

时间:2023-04-10 18:43:04 C#

C#学习教程:LinqtoEntities:在NText字段上使用ToLower()在搜索功能中,我需要创建一个带有“where”子句的LinqToEntities(L2E)查询,该子句使用以下规则将多个字符串与数据库中的数据进行比较:比较是“包含”模式,而不是严格比较:由于L2E中的Contains()方法允许轻松比较字符串必须不区分大小写:我在两个元素上使用ToLower()来执行不区分大小写的比较。所有这一切都表现得很好,但我遇到了以下异常:“我的一个字段上的参数数据类型ntext对于下层函数的参数1无效”。看起来该字段是一个NText字段,我不能ToLower()它。如何对NText字段执行不区分大小写的Contains()?切勿使用.ToLower()执行不区分大小写的比较。原因如下:这可能是错误的(您的客户端排序规则可能是土耳其语,而您的数据库排序规则可能不是)。这是非常低效的;SQLEmittedasLOWER而不是=,不区分大小写的排序规则。相反,使用StringComparison.OrdinalIgnoreCase或StringComparison.CurrentCultureIgnoreCase:varq=fromfinContext.Fooswheref.Bar.Equals("hi",StringComparison.OrdinalIgnoreCase)selectf;但是Contains()有一个问题:与Equals、UnlikeStartsWith等不同,它没有对StringComparison参数的重载。为什么?好问题;问微软。结合SQLServer对LOWER的限制意味着没有简单的方法可以做你想做的事。可能的解决方法可能包括:在此处使用lambda表达式并创建一个可以处理较低子句的中间列表。varq=Context.Foos.ToList().Where(s=>s.Bar.ToLower().Contains("hi"));效率不是很高,但是可以。如果您在where子句中有其他谓词,它对您有利:varq=Context.Foos.Where(p=>p.f1=="foo"&&p.f2=="bar").ToList()。其中(s=>s.Bar.ToLower().Contains("hi"));众所周知,这是一种非常“错误”的情况。这让我很困扰。今天,我决定创建一个视图:select*fromtableNamewheretheColumnlike'%key%'然后将这个视图加载到EF中。生活变得更轻松了!以上就是C#学习教程:LinqtoEntities:UseToLower()ontheNTextfield分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: