C# Future()在NHibernate中是什么意思?

C# Future()在NHibernate中是什么意思?,c#,nhibernate,future,C#,Nhibernate,Future,我是新来的 IEnumerable Future()的描述;下面说 // Summary: // Get a enumerable that when enumerated will execute a batch of queries in // a single database roundtrip 只是想知道它是什么意思,说明与“future”一词无关。future允许在一次往返中执行两个或多个sql,只要数据库支持它 它几乎是透明的,所以只要有可能,你就会想使用期货。如

我是新来的 IEnumerable Future()的描述;下面说

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

只是想知道它是什么意思,说明与“future”一词无关。

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

它几乎是透明的,所以只要有可能,你就会想使用期货。如果NHibernate不能在一次往返中执行查询,它将按预期在两次或更多次中执行查询

让我们看一下下面的代码:

使用(var s=sf.OpenSession())
使用(var tx=s.BeginTransaction())
{
var blogs=s.CreateCriteria()
.SetMaxResults(30)
.List();
var countOfBlogs=s.CreateCriteria()
.SetProjection(Projections.Count(Projections.Id()))
.UniqueResult();
WriteLine(“博客数:{0}”,博客数);
foreach(博客中的var博客)
{
Console.WriteLine(blog.Title);
}
tx.Commit();
}
这段代码将生成对数据库的两个查询 对数据库进行两次查询是一项昂贵的工作,我们可以看出这花费了我们很多时间 114ms从数据库获取数据。我们可以做得更好,让我们 告诉NHibernate,它可以自由地以它喜欢的任何方式进行优化

使用(var s=sf.OpenSession())
使用(var tx=s.BeginTransaction())
{
var blogs=s.CreateCriteria()
.SetMaxResults(30)
.Future();
var countOfBlogs=s.CreateCriteria()
.SetProjection(Projections.Count(Projections.Id()))
.未来价值();
WriteLine(“博客数量:{0}”,countOfBlogs.Value);
foreach(博客中的var博客)
{
Console.WriteLine(blog.Title);
}
tx.Commit();
}
我们只访问一次数据库,而不是两次访问数据库 立即查询。速度差异非常显著,80毫秒 我们节省了大约30%的总数据访问时间和 总共34毫秒


出于好奇,哪条语句实际上触发了对数据库的调用?它只是在调用
.Value
之前对所有未来语句进行排队吗?@TyCobb它将在需要任何值时触发。在本例中,
countOfBlogs.Value
。如果删除此语句,它将在博客开始迭代时执行。请记住,如果使用future,请求值,然后使用另一个future,它将在两个查询中执行。。。
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();
}
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();
}