在NHibernate 3.2中加载导航属性

时间:2012-03-10 16:48:37

标签: nhibernate linq-to-nhibernate eager-loading navigation-properties nhibernate-projections

我有这些实体:

public class Post {
    public virtual int Id { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }
}

public class Tag {
    public virtual int Id { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

public class Comment {
    public virtual int Id { get; set; }
    public virtual Post Post { get; set; }
}

我希望通过Post加载Tag相关的Comment和相关的LINQ s的计数。我用这个:

var posts = session
    .Query<Post>()
    .OrderBy(t => t.Id)
    .Select(t => new {
        Post = t,
        CommentsCount = t.Comments.Count(),
        Tags = t.Tags        
    }).ToList();

你觉得这够吗?或者你有什么建议可能比我的代码更好?感谢。

1 个答案:

答案 0 :(得分:1)

这在很大程度上取决于您的映射以及您想要对获取的结果执行的操作。如果你想访问标签列表(假设标签被映射为懒惰),Imho eager loading Tags将加快性能(选择N + 1)。

var posts = session
    .Query<Post>()
    .Fetch(t => t.Tags)
    .OrderBy(t => t.Id)
    .Select(t => new {
        Post = t,
        CommentsCount = t.Comments.Count(),
        Tags = t.Tags        
    }).ToList();

http://ayende.com/blog/1328/combating-the-select-n-1-problem-in-nhibernate