0

如何在实体框架中实现以下查询方法,下面是 NHibernate 文档http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html的片段

 Example example = Example.create(cat)
    .excludeZeroes()           //exclude zero valued properties
    .excludeProperty("color")  //exclude the property named "color"
    .ignoreCase()              //perform case insensitive string comparisons
    .enableLike();             //use like for string comparisons
 List results = session.createCriteria(Cat.class)
    .add(example)
    .list();
4

1 回答 1

0

实体框架是基于 LINQ 的。据说 Linq 是一种声明性语言,这意味着告诉我们要做什么而不是如何去做(命令式)。像这样的声明

context.Orders.Select(o => o.OrderDate).Distinct();

如果您愿意,它是一个声明式快捷方式,用于“仪式”foreach语句,OrderDate如果之前未将 s 添加到列表中,则将其添加到列表中。

我不是 NHibernate 或其标准 API 方面的专家,但标准 API 似乎比 linq 更具声明性。这使得很难比较它们。几个区别:

  • 主要的:在EF中无法通过示例查询。
  • linq 无法为整个查询设置行为。例如,如果要排除零值属性,则必须在where谓词中指定它们中的每一个(这更接近于告诉如何过滤)。
  • EF 中的大小写敏感性完全不发达。例如,像这样的语句

    People.Where(c => string.Compare( c.Name, "z", false) > 0)

    将生成与

    People.Where(c => string.Compare( c.Name, "z", true) > 0)

    数据库排序规则确定字符串比较的大小写敏感性。

  • 您可以进行LIKE查询,但再次为每个谓词指定:

    People.Where (c => c.Name.Contains("a"))

    (再次:不区分大小写)

所以我不能真正给出你的标准查询的 linq 翻译。我必须知道类属性才能指定所有单独的谓词。

于 2013-01-10T08:11:50.620 回答