我是NHibernate的新手 IEnumerable Future()的描述;说以下
// Summary:
// Get a enumerable that when enumerated will execute a batch of queries in
// a single database roundtrip
只是想知道它意味着什么,这个描述与未来'
这个词无关。答案 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毫秒。