【问题标题】:NHibernate equivalent of Entity Framework "Future Queries"NHibernate 等效于实体框架“未来查询”
【发布时间】:2014-07-31 22:45:28
【问题描述】:

实体框架有一个扩展名为Future Queries,它允许同时批处理和处理查询。

例如,来自他们的文档:

// build up queries
var q1 = db.Users
    .Where(t => t.EmailAddress == "one@test.com")
    .Future();

var q2 = db.Tasks
    .Where(t => t.Summary == "Test")
    .Future();

// this triggers the loading of all the future queries
var users = q1.ToList();

NHibernate 中是否有任何等价物,或者可能提供此类功能的扩展?

【问题讨论】:

    标签: entity-framework nhibernate


    【解决方案1】:

    是的,有这样的功能。如果你会阅读最好:

    Ayende 的NHibernate Futures

    小引:

    NHibernate 2.1 中最好的新功能之一是Future<T>()FutureValue<T>() 函数。它们本质上是一种将查询执行推迟到以后的方式,此时 NHibernate 将获得有关应用程序应该做什么的更多信息,并相应地对其进行优化。这建立在 NHibernate 的现有功能 Multi Queries 的基础上,但以一种易于使用且几乎无缝的方式实现。

    那篇文章中的一些例子:

    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();
    }
    

    【讨论】:

      【解决方案2】:

      为了扩展@Radim 的答案,下面是等效代码的样子,使用 LINQ to NHibernate:

      IEnumerable<Users> users = session.Query<Users>()
          .Where(p => p.EmailAddress == "one@test.com")
          .ToFuture();
      
      IEnumerable<Tasks> tasks = session.Query<Tasks>()
          .Where(p => p.Summary == "Test")
          .ToFuture();
      

      如您所料,两个查询都将在需要处理时被批处理并执行。

      【讨论】:

      • 太棒了。必须附加说明,这是一个很酷的功能,我确实经常使用它 - 几乎必须用于列表及其总数......
      • @RadimKöhler:同意,当您显示结果页面并需要显示项目总数时,这太棒了——无需进行两次数据库往返
      猜你喜欢
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多