【问题标题】:Entity Framework and differences between Contains between SQL and objects using ToLower实体框架和包含 SQL 和使用 ToLower 的对象之间的差异
【发布时间】:2010-06-08 03:54:09
【问题描述】:

我遇到了一个“问题”,我不太确定我是否理解实体框架。我正在使用 Entity Framework 4 并尝试使用 TDD 方法。因此,我最近使用存储库模式实现了一个搜索功能。对于我的测试项目,我正在实现我的存储库接口并拥有一组用于测试目的的“假”对象数据。

我在尝试让 Contains 子句用于不区分大小写搜索时遇到了问题。我的测试代码和用于数据库的存储库类的代码如下:

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

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

我理解为什么针对数据库后端的 EF 支持 Contains 子句。然而,令我惊讶的是我的单元测试没有。当我使用填充在集合中而不是针对数据库服务器的对象时,除了 SQL 服务器支持 like 子句之外,还有什么想法?

谢谢!

约翰

【问题讨论】:

    标签: entity-framework entity-framework-4


    【解决方案1】:

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

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

    ...如果f.Bar 恰好是一个空引用,这个语句仍然可以正常工作,因为f.Bar.Something 将合并到null。如果您考虑一下 SQL 是如何工作的,使用 LEFT JOIN,这应该不足为奇。另一方面,在 LINQ to 对象中,相同的 Where 表达式将引发空引用异常。

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

    但是,有一种方法可以在两个 LINQ 提供程序中进行不区分大小写的比较:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多