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

Jus*_*tin 3 c# nhibernate future

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

// Summary:
//     Get a enumerable that when enumerated will execute a batch of queries in
//     a single database roundtrip
Run Code Online (Sandbox Code Playgroud)

只是想知道这意味着什么,描述与“未来”一词无关

Ort*_*iga 7

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

它几乎也是透明的,因此您将尽可能使用Future。如果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();
}
Run Code Online (Sandbox Code Playgroud)

此代码将生成对数据库的两个查询。对数据库的两个查询非常昂贵,我们可以看到,从数据库获取数据花了我们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();
}
Run Code Online (Sandbox Code Playgroud)

我们只需要一次查询两个查询,而不必两次访问数据库。速度差异非常大,从80 ms变为114 ms,因此节省了大约30%的总数据访问时间,总共节省了34 ms。