【问题标题】:Eager loading with Linq query with restriction on details渴望加载 Linq 查询并限制详细信息
【发布时间】:2011-09-16 04:14:43
【问题描述】:

如何使用 NHibernate 的内置 linq 提供程序编写查询,包括急切加载和对细节的限制?例如

    public class Library
    {
       public Library()
       {
         Books = new List<Book>();
       }

       public virtual int Id { get; set; }
       public virtual string Name { get; set; }
       public virtual IList<Book> Books { get; protected internal set; }
    }

    public class Book
    {
       public Book()
       {
          Pages = new List<Page>();
       }

       public virtual int Id { get; set; }
       public virtual Library Library { get; set; }
       public virtual string Title { get; set; }
    }

以下查询显示了我需要但没有立即加载的内容

    var query = from master in session.Query<Library>()
                from detail in master.Books
                where detail.Title == detailValue
                select master;

以下查询不起作用...

    var query = from master in session.Query<Library>()
                // not allowed - causes Runtime error
                .FetchMany(m => m.Details.Where(d => d.Value == detailValue))
                select master;

非常感谢。

卡斯滕

【问题讨论】:

    标签: linq nhibernate eager-loading


    【解决方案1】:

    您可能需要考虑在此处使用 queryOver:-

    Book book = null;
    
    var query =
      Session.QueryOver<Library>()
      .Fetch(f => f.Books).Eager
      .Left.JoinAlias(f => f.Books, () => book)
      .Where(() => actor.book == detailValue);
    

    我可能错了,但我认为 NH LINQ 提供者目前无法支持这一点。

    另请注意.left,这很重要,请参阅此博客文章了解reasons why

    【讨论】:

    • 谢谢!我想使用 linq,因为我们将 linq 查询从客户端传输到服务器。在客户端,我不想依赖 NHibernate。
    • 在这种情况下,由于您已经返回过滤数据,您能否不返回列表
    • 作为一种解决方法就足够了。但是我们正在为几个应用程序开发一个框架。所以这不是我真正想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2021-08-11
    • 1970-01-01
    • 2022-06-15
    • 2011-07-20
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多