【问题标题】: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 翻译。我必须知道类属性才能指定所有单独的谓词。