NHibernate.3.0.Cookbook第四章第5节的翻译

本文介绍如何使用MultiCriteria API在NHibernate中优化大量表单和Web页面的查询操作,通过整合多个查询到一次数据库交互中提升应用性能,并提供具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Using MultiCriteria

使用多条件(MultiCriteria)

  为了显示大量的表单和web页面,我们需要运行好几个查询. 例如,将查询结果一次显示在一个页面里是很正常的,这通常需要两个查询.第一个统计所有有效的结果,第二个,只获取10个/20个结果的数据.MultiCriteria使得我们可以将这两个查询整合到一次数据库交互,以提高应用程序的性能.本节介绍如何使用MultiCriteria去获取products的一个分页的结果集.

准备

1.   完成本章简介中的通用步骤.
2.   在Queries类中,添加下面的结构:

View Code
public struct PageOf<T>
{
  public int PageCount;
  public int PageNumber;
  public IEnumerable<T> PageOfResults;
}

3.   在Queries类中,添加下面的方法:

View Code
public PageOf<Product> GetPageOfProducts(
  int pageNumber,
  int pageSize)
{
  var skip = (pageNumber - 1) * pageSize;
  var countQuery = GetCountQuery();
  var resultQuery = GetPageQuery(skip, pageSize);
  var multiCrit = _session.CreateMultiCriteria()
    .Add<int>("count", countQuery)
    .Add<Product>("page", resultQuery);
  var productCount = ((IList<int>)multiCrit
    .GetResult("count")).Single();
  var products = (IList<Product>)multiCrit
    .GetResult("page");
  var pageCount = (int) Math.Ceiling(
    productCount/(double) pageSize);
  return new PageOf<Product>()
           {
             PageCount = pageCount,
             PageOfResults = products,
             PageNumber = pageNumber
           };
}
private ICriteria GetCountQuery()
{
  return _session.QueryOver<Product>()
    .Select(list => list
            .SelectCount(m => m.Id))
    .UnderlyingCriteria;
}
private ICriteria GetPageQuery(int skip, int take)
{
  return _session.QueryOver<Product>()
    .OrderBy(m => m.UnitPrice).Asc
    .Skip(skip)
    .Take(take)
    .UnderlyingCriteria;
}

4.   在Program.cs中, 为RunQueries方法添加下述代码:

View Code
static void RunQueries(ISession session)
{
  var queries = new Queries(session);
  var result = queries.GetPageOfProducts(1, 2);
  var heading = string.Format("Page {0} of {1}",
                              result.PageNumber,
                              result.PageCount);
  Show(heading, result.PageOfResults);
}

5.   编译运行,结果如下图所示:

原理

  MultiCriteria API在所有NHibernate支持的RDBMS上都可以使用.但是,只有在Microsoft SQL Server和Oracle可以将两个查询整合到一次数据库交互中.而对于其他的数据库,该功能是模拟实现的.你的应用程序不必关注这个,总之,可以正常使用她.
  在本示例中,我们将两个查询整合到一次数据库交互中.我们的第一个查询,统计了数据库中所有的products,第二个查询,返回了一个页面,该页面含有三个products中的前两个,并按单价排序.我们使用QueryOver的Skip和Take实现该功能.
  在MultiCriteria语法中,有几个挺有意思的东西.
var multiCrit = session.CreateMultiCriteria()
  .Add<int>("count", countQuery)
  .Add<Movie>("page", resultQuery);
  首先, 你会注意到我们使用"count"和"page"标记了我们的查询.这不是必须的.相反,我们可以使用MultiCriteria中每个criteria对象的索引来获取结果.与列表索引相比,名字更不容易被搞乱,所以我们将使用名字.
  我们使用泛型参数来为我们的结果指明元素类型.也就是说,我们的第一个查询返回一个整数list,第二个返回一个movies的list.MultiCriteria没有提供一个方法来直接返回一个单一的实体或标量值.相反,我们使用LINQ to Object's的Single方法来获取list中的第一个也是唯一的一个值.
  当我们获得了product的计数时,两个查询都会被立即执行,并且结果被存储到内存中.当我们获得product的页面时,MultiCriteria 只返回已执行的查询的结果.

转载于:https://www.cnblogs.com/carfieldSE/archive/2012/07/25/2608302.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值