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();