C# lambda中的ToUpper()不工作
为了确保搜索不区分大小写,我正在使用C# lambda中的ToUpper()不工作,c#,entity-framework,lambda,C#,Entity Framework,Lambda,为了确保搜索不区分大小写,我正在使用ToUpper()。 我正在寻找类似吉米(大写字母J)的东西。吉米(全小写)没听懂吗?为什么?因为您使用的是实体框架,一个linq到sql框架,所以实际上您试图让数据库执行.ToUpper,而不是像运行IEnumerable时那样在内存中执行一个。如果框架中的查询转换不支持该函数,则不会使用该函数或引发异常 通常,您可以通过检查是针对IQueryable对象调用函数来预测这种行为,该对象将所有调用作为表达式树进行排队以进行转换,还是针对IEnumerable调
ToUpper()
。
我正在寻找类似吉米(大写字母J)的东西。吉米(全小写)没听懂吗?为什么?因为您使用的是实体框架,一个linq到sql框架,所以实际上您试图让数据库执行
.ToUpper
,而不是像运行IEnumerable
时那样在内存中执行一个。如果框架中的查询转换不支持该函数,则不会使用该函数或引发异常
通常,您可以通过检查是针对IQueryable
对象调用函数来预测这种行为,该对象将所有调用作为表达式树进行排队以进行转换,还是针对IEnumerable
调用函数,该对象使用foreach
和产生返回
来处理求值。因为Linq函数是扩展方法,所以多态性在这里不适用
如果您不担心从内存中的表中获取每个条目的性能影响,请添加一个.AsEnumerable()
调用,您的函数将根据本地化数据进行计算
var Result = addressContext.Address_Lookup
.Where(c => c.Address_Full.ToUpper().Contains(term.ToUpper())
|| c.Address_Full.ToUpper().Contains(TermModified.ToUpper()))
.Select(e => new {
id = e.Address_ID,
label = e.Address_Full,
value = e.Address_Full })
.ToList();
.ToUpper
无法转换为SQL函数。在这种情况下,字符串比较类型将取决于数据库排序规则。@PatrykĆwiek:相反。这取决于查询提供程序,但EF应该特别容易做到这一点。。。不知道为什么不行。它和其他方法一起工作吗?您能给我们看一下您的排序规则设置吗?“如果框架中的查询转换不支持该功能,那么它最多也不会被使用,最坏也会崩溃。”您可能希望切换最佳和最坏情况的标签。如果系统默默地忽略了最重要的部分,那将是非常可怕的我认为崩溃与沉默的失败是一个意见问题——所以我将去掉这两个标签;3谢谢你的回答,不知为什么还是不行?
var Result = addressContext.Address_Lookup
.AsEnumerable()
.Where(c => c.Address_Full.ToUpper().Contains(term.ToUpper())
|| c.Address_Full.ToUpper().Contains(TermModified.ToUpper()))
.Select(e => new
{
id = e.Address_ID,
label = e.Address_Full,
value = e.Address_Full
})
.ToList();