2011-10-27 4 views
1

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 개의 조회가 생성되었습니다.

내가이 사용자 일대 객체 매핑과 함께 다음 코드를 해킹 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) 
) 

에 정의 된, 내 실제 데이터와 유사하다이 예제 데이터베이스를 관찰 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)] 

를 생성하고, 내 문제를 해결합니다.

+0

매핑 관점에서 또는 QueryOver 또는 Linq를 사용하여이 가져 오기 전략을 수행하고 싶습니까? –

+0

무엇이든 좋을 것입니다. 나는 단지 이것을하기 위해 주로 NHibernate를 사용하고 싶다. – Squirrelsama

답변

0

FuturesQueryOver으로 원하는 것을 얻을 수 있다고 생각합니다. 다음 문서에서 살펴 보자 :

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

당신은 내가 당신의 요구에 그 예를 더 조정할 수 있습니다 위에서 필요한 것을 수행하는 방법을 시각화 할 수 없습니다.

+0

글쎄, 당신이 시도했기 때문에 나는이 대답을 받아들이고있다. 그리고 그것은 정말로 막대한 코드 혼란으로 문제를 해결할 것 같다. – Squirrelsama

관련 문제