代码之家  ›  专栏  ›  技术社区  ›  mathieu

NHibernate N+1选择:架构解决方案?

  •  1
  • mathieu  · 技术社区  · 16 年前

    Post -> User
    

    class User
    {
        public virtual string Name { get; set; }
        public virtual IList<Post> Posts { get; set; }
    }
    
    class Post
    {
        public virtual string Title { get; set; }
        public virtual User Author { get; set; }
    }
    

    class UserService
    {
        IRepositoryUsers repositoryUsers;
    
        IList<User> GetUsers()
        {
            return this.repositoryUsers.GetAllUsers();
        }
    }
    

    2 回复  |  直到 16 年前
        1
  •  1
  •   John Feminella    16 年前

    一般来说,有几种方法可以解决Select N+1问题。对于NHibernate,我最喜欢的方法之一是使用Criteria API,这是非常明智和深思熟虑的。

    session.CreateCriteria(typeof(Fruit))            // Get me some fruit.
        .SetFetchMode("CitrusType", FetchMode.Eager) // Just get this one field.
        .Add(Expression.Eq("Basket", 47))            // Only fruit that are in this basket.
        .List();                                     // Get 'em all.
    

    要阅读更多关于这个和其他策略的信息,我建议你看看这个 interesting blog post .

        2
  •  0
  •   gcores    16 年前

    您可以做的一件事是为需要检索数据的每个场景制定一个获取策略。 这 blog post 解释了这类问题的可能解决方案,作者使用了他自己的IRepository版本,但您在存储库中使用了相同的想法(或查看他的 NCommon 项目以获得一些灵感)