Future()在NHibernate中意味着什么?

时间:2015-04-28 22:29:28

标签: c# nhibernate future

我是NHibernate的新手 IEnumerable Future()的描述;说以下

// Summary:
//     Get a enumerable that when enumerated will execute a batch of queries in
//     a single database roundtrip

只是想知道它意味着什么,这个描述与未来'

这个词无关。

1 个答案:

答案 0 :(得分:4)

Future允许在单个往返中执行两个或多个sql,只要数据库支持它。

它也几乎是透明的,所以你应该尽可能使用期货。如果NHibernate无法在单个往返中执行查询,它将按预期执行两个或更多个查询。

来自http://ayende.com/blog/3979/nhibernate-futures

  

让我们看看以下代码:

using (var s = sf.OpenSession())
using (var tx = s.BeginTransaction())
{
    var blogs = s.CreateCriteria<Blog>()
        .SetMaxResults(30)
        .List<Blog>();
    var countOfBlogs = s.CreateCriteria<Blog>()
        .SetProjection(Projections.Count(Projections.Id()))
        .UniqueResult<int>();

    Console.WriteLine("Number of blogs: {0}", countOfBlogs);
    foreach (var blog in blogs)
    {
        Console.WriteLine(blog.Title);
    }

    tx.Commit();
}
  

此代码将为数据库生成两个查询   对数据库的两个查询是昂贵的,我们可以看到它花了我们   114ms从数据库中获取数据。我们可以做得更好,让我们   告诉NHibernate可以自由地以任何方式进行优化

using (var s = sf.OpenSession())
using (var tx = s.BeginTransaction())
{
    var blogs = s.CreateCriteria<Blog>()
        .SetMaxResults(30)
        .Future<Blog>();
    var countOfBlogs = s.CreateCriteria<Blog>()
        .SetProjection(Projections.Count(Projections.Id()))
        .FutureValue<int>();

    Console.WriteLine("Number of blogs: {0}", countOfBlogs.Value);
    foreach (var blog in blogs)
    {
        Console.WriteLine(blog.Title);
    }

    tx.Commit();
}
  

我们只使用两次,而不是两次进入数据库   立即查询。速度差异相当大,80毫秒   为114毫秒,所以我们节省了大约30%的总数据访问时间和a   总共34毫秒。