2009-11-15 102 views
4

我開始與nHibernate並有一個簡單的例子,我不能按我的意願工作。nhibernate 2 linq急切加載

我有兩個模型對象(博客和帖子),我想將它們全部加載到一個場景的單個查詢中。我想在其他情況下延遲加載。

我天真地以爲我可以寫這樣的事:

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> 

回答

1

鮮明的是你所需要的...

編輯: 當它不工作:做不同的tolist後。 我不知道爲什麼NHibernate會加載與返回的數據庫記錄數相同數量的對象,並且不會自動執行清晰操作。這個問題/功能不是Linq特有的,但是在使用條件或hql時也會發生。

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

有時可以更有效地執行比一個查詢與左外連接以執行2個查詢(單獨,或使用multiquery /將來)。

+0

謝謝帕科和阿列克謝。你是對的,這是伎倆。我會在另一個論壇發帖,試圖理解爲什麼這樣做。 – LostSilver 2009-11-17 20:06:54

-3

我們也有同樣的問題。在我看來,linq總是處於急切的加載模式。所以你不需要做exapnd。不過這很糟糕。你有沒有試圖聯繫他們谷歌組中的HN傢伙?

+0

Linq並不總是處於急切的加載模式。 – Paco 2009-11-17 20:39:37

4

尋找其他論壇後(也許我應該妥善首先做到了這一點!)我使用此解決方案:

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

我不想用鮮明的,因爲我想返回的IQueryable

似乎工作。我只需要知道理論:)

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

+0

感謝發佈此問題 – Paco 2009-11-20 20:12:03

+2

這不是一個解決方案:如果您使用LIMIT x,y並刪除代碼端的重複項,它將返回更少的結果。 – 2010-03-28 10:15:03