【问题标题】:Entity Framework method to query based on a complete object基于完整对象查询的实体框架方法
【发布时间】:2013-01-09 15:24:10
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    实体框架是基于 LINQ 的。 Linq 被称为是一种声明性语言,这意味着告诉 what 去做而不是 how 去做(命令式)。像

    这样的声明
    context.Orders.Select(o => o.OrderDate).Distinct();
    

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

    我不是 NHibernate 或其标准 API 方面的专家,但标准 API 似乎比 linq 更具声明性。这使得很难比较它们。一些不同之处:

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

      这样的语句

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

      将生成与

      相同的 SQL

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

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

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

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

      (再次强调:没有区分大小写)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多