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個查詢好,解決了我的問題。
你想從映射的角度或使用QueryOver或Linq實現這個獲取策略嗎? –
任何一個都不錯。我主要只是想用NHibernate來做到這一點。 – Squirrelsama