网站制作 推荐新鸿儒,工业设计网站免费,网站建设模板素材,网络系统的价值跟用户数量的关系本节内容 NHibernate中的查询方法条件查询(Criteria Query)1.创建ICriteria实例2.结果集限制3.结果集排序4.一些说明根据示例查询(Query By Example)实例分析结语上一节#xff0c;我们介绍了NHibernate查询语言的一种#xff1a;NHibernate查询语言(HQL#xff0c;NHiberna…本节内容 NHibernate中的查询方法条件查询(Criteria Query)1.创建ICriteria实例2.结果集限制3.结果集排序4.一些说明根据示例查询(Query By Example)实例分析结语上一节我们介绍了NHibernate查询语言的一种NHibernate查询语言(HQLNHibernate Query Language)这一节介绍一下条件查询(Criteria API)。 NHibernate中的查询方法 在NHibernate中提供了三种查询方式给我们选择NHibernate查询语言(HQLNHibernate Query Language)、条件查询(Criteria APICriteria Query)、(根据示例查询(QBEQuery By Example)是条件查询的一种特殊情况)、原生SQL(Literal SQLT-SQL、PL/SQL)。每个人有不同的喜好和特长可以根据自己的情况选择使用其中的一种或几种。这一节我们介绍条件查询。 条件查询(Criteria Query) HQL极为强大但是有些人希望能够动态的使用一种面向对象API创建查询而不是在.NET代码中嵌入字符串。在NHibernate中提供了一种直观的、可扩展的Criteria API。在我们键入查询语句的时候提供了编译时的语法检查VS提供了强大的智能提示。如果你对HQL的语法感觉不是很舒服的话用这种方法可能更容易。这种API也比HQL更可扩展。 典型用法从ISession接口中创建ICriteria实例对象在这个ICriteria实例对象上设置一个或多个表达式要求ICriteria接口返回需要的列表就是根据表达式从数据库中返回对象。 注意由于篇幅有限我在这里仅仅贴出了数据访问层的代码。测试这些方法的代码就没有贴出来了你可以下载本系列的源代码仔细看看测试这些方法的代码。这些实例我争取写出来可以运行起来大家下载源码看看效果一些数据需要按个人数据库里的数据情况修改。例如查询条件和结果。这节我们在上一节源代码的基础上在数据访问层中新建QueryCriteriaAPI.cs类用于编写条件查询方法在数据访问的测试层新建一QueryCriteriaAPIFixture.cs类用于测试。 1.创建ICriteria实例 使用ISession接口的CreateCriteria方法创建了NHibernate.ICriteria接口一个特定的持久化类的查询实例也可以说ISession是用来制造Criteria实例的工厂。 public IListCustomer CreateCriteria()
{ICriteria crit _session.CreateCriteria(typeof(Customer));crit.SetMaxResults(50);IListCustomer customers crit.ListCustomer();return customers;
} 例如上面的例子返回Customer对象集合设置最大的集合数量为50条。 2.结果集限制 使用ICriteria接口提供的Add方法添加Restrictions类中约束表达式可以限制一些结果集的作用。 public IListCustomer Narrowing()
{IListCustomer customers _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Like(Firstname, YJing%)).Add(Restrictions.Between(Lastname, A%, Y%)).ListCustomer();return customers;
} 3.结果集排序 使用ICriteria.Order对结果集排序第二个参数true代表ascfalse代表desc。例如下面例子查询Customer对象按FirstName降序、Lastname升序。 public IListCustomer Order()
{return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Like(Firstname,Y%)).AddOrder(new NHibernate.Criterion.Order(Firstname, false)).AddOrder(new NHibernate.Criterion.Order(Lastname, true)).ListCustomer();
} 4.一些说明 条件查询同样支持关联查询、动态关联抓取(在介绍一对多多对多关系中阐述)投影、聚合和分组离线(detached)查询和子查询是2.0版新增加的内容以后在相关知识中介绍。也可以自行参考NHibernate参考文档13章。 根据示例查询(Query By Example) 根据示例查询(QBEQuery By Example)是条件查询的一种特殊情况NHibernate.Criterion.Example类根据你指定的实例创造查询条件。其典型的用法创建一个Example实例在Example实例上设置值根据Example和设置NHibernate返回其对象集合。 例如下面的例子按照指定Customer查询数据库里的记录 public IListCustomer Query()
{Customer customerSample new Customer() { Firstname YJing, Lastname Lee };return _session.CreateCriteria(typeof(Customer)).Add(Example.Create(customerSample)).ListCustomer();
} 你可以自行调整Example使之更实用 public IListCustomer UseQueryByExample_GetCustomer(Customer customerSample)
{Example example Example.Create(customerSample).IgnoreCase().EnableLike().SetEscapeCharacter();return _session.CreateCriteria(typeof(Customer)).Add(example).ListCustomer();
} 实例分析 实例1利用CriteriaAPI按Firstname和Lastname查询顾客。 public IListCustomer GetCustomersByFirstnameAndLastname(string firstname, string lastname)
{return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Eq(Firstname, firstname)).Add(Restrictions.Eq(Lastname, lastname)).ListCustomer();
} 测试调用GetCustomersByFirstnameAndLastname方法查询Firstname为“YJingLastname为Lee的顾客判断查询结果数量是否为1。(注在数据库中有符合这一个记录) [Test]
public void GetCustomerByFirstnameAndLastnameTest()
{IListCustomer customers _queryCriteriaAPI.GetCustomersByFirstnameAndLastname(YJing, Lee);Assert.AreEqual(1, customers.Count);
} 实例2利用CriteriaAPI获取顾客ID大于CustomerId的顾客。 public IListCustomer GetCutomersWithIdGreaterThan(int customerId)
{return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Gt(CustomerId, customerId)).ListCustomer();
} 结语 好了通过2篇文章的介绍对NHibernate中的查询语法有了大致了解知道了NHibernate中两种最主要的查询方式还有一种原生SQL查询内容不多请参考NHibernate官方文档吧。多多练习下节将介绍对对象的操作。 本系列链接NHibernate之旅系列文章导航 NHibernate QA 欢迎加入NHibernate中文社区一起讨论NHibernate知识请到NHibernate中文社区下载本系列相关源码。下次继续分享NHibernate转载于:https://www.cnblogs.com/lyj/archive/2008/10/16/1312906.html