2012-04-20 3 views
1

죄송합니다. NHibernate를 처음 사용하는 초보자입니다. 나는이 질문에 당혹스럽지 않기를 바랍니다.NHibernate 관련 테이블에서 값 집합을 선택하십시오

Logs 및 UserProfiles 테이블에 각각 Log 및 UserProfile이라는 두 개의 개체가 있습니다. 각 Log 객체는 하나의 UserProfile 객체 또는 하나의 UserProfile 객체를 참조합니다.

알파벳순으로 정렬 된 로그 테이블에서 UserProfile.UserName 문자열의 고유 목록을 수집하는 효율적인 방법을 원합니다. Linq의 경우 이것은 매우 간단하지만 데이터베이스 측에서이 작업을 수행하기를 원합니다. 무엇이 내

public IEnumerable<string> GetUserNamesInLogs(){} 

같은 모양일까요? 내가 NHibernate에의 동등한 찾고 있어요

select distinct 
    u.UserName 
from 
    Logs as l 
inner join 
    UserProfiles as u 
    on u.UserId = l.UserId; 

: 나는 SQL에서이 글을 쓰는 경우

, 나는 같은 것을 할 것입니다. 나는 이것을 위해 게으른 로딩을 원하지 않는다고 생각한다.하지만 성능이 떨어지는 것처럼 보이지만 게으른 로딩이 어떻게 작동하는지 명확하지 않을 수있다.

+0

로그를로드 한 다음 각 로그에 고유 한 사용자 이름 모음을로드하지 않겠습니까 아니면 모든 고유 한 사용자 이름으로 쿼리를 원하는지 말하고 싶습니까? 이 질문은 충분히 명확하지 않습니다. – Rippo

+0

내 로그 항목에 표시되는 고유 한 사용자 이름 목록을 원합니다. 나는 게으른 짐을 싣고 싶지 않다고 생각 하겠지만 잘못 될 수 있습니다. 나는 내 질문에 더 많은 맥락을 추가 할 것이다. –

답변

0

완전히 내가 기준에 원하는 방식으로 작동 할 수있는 durn 일을 얻기 위해 실패, 내가 바람 피운 :

var result = _Session.CreateQuery("select distinct profile.UserName from Log as l inner join l.UserProfile as profile order by profile.UserName asc") 
    .List<string>(); 

이 나에게 내가 찾던 그 결과를 주었다. 그래도 도움을 주신 분들께 감사드립니다.

1

클래스 및 매핑이 없으면 대답하기가 어렵습니다.

: 당신은 이런 식으로 뭔가를 시도 할 수

public class UserProfile 
{ 
... 

public virtual IList<Log> Logs {get;set;} 

... 
} 


<?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" > 
    <class name="blabla.UserProfile, blabla" table="UserProfiles"> 

    ..... 
    <bag name="Logs" fetch="select" inverse="true" access="property" lazy="true"> 
    <key column="UserId"/> 
    <one-to-many class="blabla.Log, blabla"/> 
    </bag> 

............ 

: 당신은 사용자 프로필에 대한 클래스와 매핑과 같아야합니다, 당신의 USERPROFILE 클래스의 사용자 프로필의 로그에 해당하는 로그 컬렉션 속성을 매핑 가정하면

UserProfile upAlias=null; 

var result = yourNHSession.QueryOver<UserProfile>(() => upAlias) 
       .JoinQueryOver(x => x.Logs) 
       .Select(
        Projections.Distinct(
        Projections.ProjectionList() 
        .Add(Projections.Property<UserProfile>(x=>x.Name)))) 
       .OrderBy(() => upAlias.Name) 
       .Asc 
       .List<String>().ToList(); 
+0

흠 ... 실제로'UserProfile' 클래스를 Log 클래스에 매핑했습니다. 그게 효과가 있니? 그리고 와우, 그렇게 복잡해 보입니다. –

+0

@JeremyHolovacs : 내 게시물을 편집했습니다. 도움이되기를 바랍니다. 투영법/투영법에 비해 투영법/별색을 투영법에 추가 할 경우 복잡해집니다 .-) 더 간단한 해결책이있을 수 있습니다. – jbl

+0

나는 오늘 밤 이걸 시험해 보겠다. –

2

JBL 답변에 대한 일부 최적화 :

UserProfile userProfileAlias = null; 
Log logAlias = null; 

session.QueryOver(() => userProfileAlias) 
       .JoinAlias(() => userProfileAlias.Logs,() => logAlias) 
       .Select(
        Projections.Distinct(Projections.Property(() => userProfileAlias.Name)))) 
       .OrderBy(() => userProfileAlias.Name).Asc 
       .List<string>(); 
관련 문제