如何在实体框架中实现以下查询方法,下面是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();
实体框架基于LINQ。Linq被认为是一种声明性语言,这意味着告诉做什么,而不是告诉如何做(命令式)。像
这样的语句context.Orders.Select(o => o.OrderDate).Distinct();
是一个"仪式性"foreach
语句的声明性快捷方式,如果OrderDate
之前没有被添加到列表中,则将其添加到列表中。
我不是NHibernate或它的标准API方面的专家,但是标准API似乎比linq更具有声明性。这使得很难对它们进行比较。
- 主要的:在EF中不能按示例查询。 在linq中没有办法为整个查询设置行为。例如,如果你想排除零值属性,你必须在
EF中的大小写敏感性完全不发达。例如,像
这样的语句People.Where(c => string.Compare( c.Name, "z", false) > 0)
将生成与
相同的SQLPeople.Where(c => string.Compare( c.Name, "z", true) > 0)
数据库排序规则决定字符串比较的大小写敏感性。
您可以执行
LIKE
查询,但是,再次为每个单独的谓词指定:People.Where (c => c.Name.Contains("a"))
where
谓词中指定它们中的每一个(这更接近于告诉如何过滤)。所以我真的不能给你的标准查询一个linq翻译。我必须知道类的属性,以便能够指定所有单独的谓词。