lambda中的ToUpper()不起作用

时间:2014-10-30 17:32:14

标签: c# entity-framework lambda

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()。 我正在寻找像吉米这样的东西(有一个大写的J)。吉米(全是小写)没有抓住?为什么呢?

1 个答案:

答案 0 :(得分:2)

由于你正在使用实体框架,一个linq-to-sql框架,你实际上是在尝试让数据库执行一个.ToUpper,而不是像运行一个内存那样执行一个内存。 IEnumerable。如果框架中的查询转换不支持该函数,则它将不会被使用或抛出异常。

您通常可以通过检查是否针对IQueryable对象调用函数来预测此类行为,该对象将所有调用排队为用于翻译的表达式树,或IEnumerable,其使用{foreach 1}}和yield return来处理评估。由于Linq函数是扩展方法,因此多态性不适用于此。

如果您不担心从内存表中获取每个条目的性能影响,请添加.AsEnumerable()调用,您的函数将评估本地化数据。

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