nhibernate 2 linq渴望加载

时间:2009-11-15 16:18:02

标签: linq nhibernate

我开始使用nHibernate并有一个简单的例子,我无法按照自己的意愿工作。

我有两个模型对象(博客和帖子),我想在一个场景的单个查询中加载它们。我希望在其他情况下延迟加载。

我天真地以为我可以这样写:

var blogs = session.Linq<Blog>().Expand("Posts");

但这会为每个帖子提供一个博客实例,而不是将帖子添加到博客中。

我知道我做的事情很愚蠢。有人可以指出它是什么?是否需要在linq查询中关联帖子和博客实体?

代码和映射:

public class Blog
{
    public Blog()
    {
        Posts = new HashSet<Post>();
    }
    public virtual long Identifier { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
    public virtual Post AddPost(Post post)
    {
        post.Blog = this;
        Posts.Add(post);
        return post;
    }
}


public class Post
{
    public virtual long Identifier { get; set; }
    public virtual string Name { get; set; }
    public virtual Blog Blog { get; set; }
}

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibEx" namespace="nhibEx">
  <class name="Blog" lazy="true">
    <id name="Identifier">
      <generator class="native" />
    </id>
    <property name="Name" not-null="true" length="100"/>
    <set name="Posts" inverse="true" cascade="save-update" lazy="true">
      <key column="BlogIdentifier" foreign-key="fk_Post_Blog"/>
      <one-to-many class="Post"/>
    </set>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibEx" namespace="nhibEx">
  <class name="Post" lazy="true">
    <id name="Identifier">
      <generator class="native" />
    </id>
    <property name="Name" not-null="true" length="255"/>
    <many-to-one name="Blog" column="BlogIdentifier" class="Blog" />
  </class>
</hibernate-mapping>

3 个答案:

答案 0 :(得分:4)

在搜索其他论坛之后(也许我应该首先正确地做到这一点!)我正在使用这个解决方案:

var blogs = session.Linq<Blog>();
blogs.QueryOptions.RegisterCustomAction(
criteria => criteria.SetResultTransformer(new DistinctRootEntityResultTransformer()));
var results = blogs.Expand("Posts");

我不想使用Distinct,因为我想返回IQueryable

似乎工作。我只需要知道这个理论:)

http://nhforge.org/wikis/howtonh/get-unique-results-from-joined-queries.aspx

答案 1 :(得分:1)

区别是你需要的......

编辑: 当它不起作用时:在tolist之后执行distinct。 我不知道为什么NHibernate会加载与返回的数据库记录数相同数量的对象,并且不会自动执行不同的操作。此问题/功能不是Linq特定的,但在使用条件或hql时也会发生。

session.Linq<Blog>().Expand("Posts").ToList().Distinct();

有时执行2个查询(单独或使用多个查询/将来)比使用左外连接执行一个查询更有效。

答案 2 :(得分:-3)

我们遇到了同样的问题。在我看来,linq总是处于急切的加载模式。所以你不需要做exapnd。但是非常糟糕。您是否曾尝试联系他们谷歌小组中的HN人员?