C# Future()在NHibernate中是什么意思?
我是新来的 IEnumerable Future()的描述;下面说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,只要数据库支持它 它几乎是透明的,所以只要有可能,你就会想使用期货。如
// 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();
}