SQL 2008 | .NET 4.0 | NHibernate 3.1 | NHibernate.Castle 3.1 |데이터로 NHibernate 테이블 연결하기
2.5.2 Castle.Core 그래서 나는 그것을 처리 할 수있는 가장 인색 방법을 보였다으로 난 그냥이 질문에 대한 대답처럼 매핑, NHibernate Mapping a Many to Many with Data on Join Table
처음이 질문의 저자와 같은 메타 데이터와 연결 테이블이 그것. 그러나 show_sql
을 켜고 진행 상황을 관찰 한 후 ID 조회가 N + 1 개의 쿼리를 생성하여 N이 연관의 수인 N 개의 조회가 생성되었습니다.
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)
)
에 정의 된, 내 실제 데이터와 유사하다이 예제 데이터베이스를 관찰 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);
}
~~~~~이 해결은 N + 1 개 쿼리보다 더이 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)]
를 생성하고, 내 문제를 해결합니다.
매핑 관점에서 또는 QueryOver 또는 Linq를 사용하여이 가져 오기 전략을 수행하고 싶습니까? –
무엇이든 좋을 것입니다. 나는 단지 이것을하기 위해 주로 NHibernate를 사용하고 싶다. – Squirrelsama