实体框架方法基于完整对象进行查询

时间:2013-01-09 15:24:11

标签: entity-framework linq-to-sql entity-framework-4 linq-to-entities entity-framework-4.1

如何在Entity Framework中实现以下查询方法,  以下是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();

1 个答案:

答案 0 :(得分:0)

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

这样的陈述
context.Orders.Select(o => o.OrderDate).Distinct();
如果您愿意,

是一个声明性快捷方式,用于“礼仪”foreach语句,如果之前没有将OrderDate添加到列表中,则将where添加到列表中。

我不是NHibernate或其标准API的专家,但标准API似乎比linq更具说明性。这使得很难比较它们。一些差异:

  • 主要的一个:在EF中无法通过示例查询。
  • linq无法为整个查询设置行为。例如,如果要排除零值属性,则必须在People.Where(c => string.Compare( c.Name, "z", false) > 0)谓词中指定每个属性(这更接近于告诉 如何过滤)。
  • 案例敏感度在EF中完全不发达。例如,像

    这样的陈述

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

    将生成与

    相同的SQL

    LIKE

    数据库排序规则确定字符串比较的区分大小写。

  • 您可以执行People.Where (c => c.Name.Contains("a"))个查询,但是,再次为每个单独的谓词指定:

    {{1}}

    (再次:案件没有区别)

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