2011-10-27 43 views
1

SQL 2008 | .NET 4.0 | NHibernate 3.1 | NHibernate.Castle 3.1 | Castle.Core 2.5.2NHibernate鏈接表與數據

所以我有一個鏈接表的元數據,像這樣的問題,筆者NHibernate Mapping a Many to Many with Data on Join Table

起初,我映射就像回答這個問題,因爲它似乎是最簡約的方式來處理它。但是,在開啓show_sql並觀察發生了什麼後,ID查找最終產生了N + 1個查詢,其中N是關聯數。

觀察本實施例中的數據庫,類似於我的實際數據,在SQL的語法

CREATE TABLE [User] 
(
    Id int PRIMARY KEY 
) 

CREATE TABLE UserPref 
(
    Id int PRIMARY KEY, 
    Name varchar(32) 
) 

CREATE TABLE UserPrefAssociation 
(
    UserId int, 
    PrefId int, 
    Value varchar(32) 
) 

I中所定義與該用戶一個對多對象映射一起被黑以下代碼IList<UserPrefAssociation> Preferences { get; set; }

public IDictionary<string, string> GeneratePrefDict() 
    { 
     return Preferences 
      .ToDictionary(i => i.UserPref.Name, i => i.Value); 
    } 

當然,這很好,但如前所述,每個i.UserPref.Name是SQL的附加查詢。

在SQL中播放後,我發現查詢完成我想要的。然後我的問題變成如何與NHibernate做到這一點?

SELECT UserPref.Name, UserPrefAssociation.Value 
FROM [User] 
    INNER JOIN UserPrefAssociation ON [User].Id = UserPrefAssociation.UserId 
    INNER JOIN UserPref ON UserPrefAssociation.UserPrefId = UserPref.Id 
WHERE [User].Id = 1 

~~~~解決~~~~~

using NHibernate.Linq; 
    ... 
    public IDictionary<string, string> GeneratePrefDict(ISession s) 
    { 
     return 
      (from entry in s.Query<User_UserPref>() 
      where entry.User == this 
      select new 
      { 
       key = entry.UserPref.Name, 
       value = entry.Value 
      }) 
      .ToDictionary(i => i.key, i => i.value); 
    } 

生成此SQL

NHibernate: select userpref1_.Name as col_0_0_, user_userp0_.Value as col_1_0_ f 
rom User_UserPref user_userp0_ left outer join UserPref userpref1_ on user_userp 
0_.UserPrefId=userpref1_.Id where [email protected];@p0 = 1 [Type: Int32 (
0)] 

這是比N + 1個查詢好,解決了我的問題。

+0

你想從映射的角度或使用QueryOver或Linq實現這個獲取策略嗎? –

+0

任何一個都不錯。我主要只是想用NHibernate來做到這一點。 – Squirrelsama

回答

0

我想你可以用FuturesQueryOver來實現你想要的。看看下面的文章:

Fighting cartesian product (x-join) when using NHibernate 3.0.0

如果你不能想象如何完成你從上面需要什麼我可以調整這個例子更您的需求。

+0

嗯,我接受了這個答案,因爲你試過了,看起來它確實可以解決大規模代碼混亂的問題。 – Squirrelsama