代码之家  ›  专栏  ›  技术社区  ›  John Ptacek

实体框架及SQL与ToLower对象的区别

  •  0
  • John Ptacek  · 技术社区  · 16 年前

    if (!string.IsNullOrEmpty(Description))
    {
         items = items.Where(r => r.Description.ToLower().Contains(Description.ToLower()));
    }
    

    但是,当我运行测试用例时,如果我的用例与底层数据不匹配,则不会填充结果。我试着调查一下我认为是个问题。为了澄清我的想法,我运行了一段代码,并想知道使用EF的相同代码是否适用于SQL后端数据库,因为SQL将显式支持like命令,并且它按照我的预期执行,使用相同的逻辑。

    谢谢!

    约翰

    1 回复  |  直到 16 年前
        1
  •  4
  •   Craig Stuntz    16 年前

    LINQ到实体和LINQ到对象有不同的规则。就这么简单。例如,在LINQ to Entities中,我可以运行如下查询:

    var foo = Context.Foos.Where(f => f.Bar.Something == bar);
    

    ... 如果 f.Bar 如果是空引用,则此语句仍然可以正常工作,因为 f.Bar.Something 将合并到 null . 如果您考虑一下SQL是如何工作的,使用左连接,这就不奇怪了。另一方面,在LINQ to objects中 Where

    正如你所发现的,还有其他方面的不同。区分大小写就是其中之一。执行LINQ to Entities查询时,会将其转换为SQL。相等比较是基于数据库和SQL中定义的排序规则执行的。要自定义数据库的排序规则,通常需要为列选择特定的排序规则。另一方面,要自定义对象的排序规则,通常需要传递一个比较函数,这在LINQ中永远不会被接受,因为函数(与表达式相反)不能转换为SQL。

    var foo = Context.Foos.Where(f => f.SomeString.Equals(someValue, StringComparison.OrdinalIgnoreCase));