2011-08-06 4 views
2

난 기본적으로 가입 조건이 그 Translation.Unit.Text == ExternalUnit.TextNHibernate에서이 프로젝션을 수행하는 방법?

있는 다음과 같은 형식

<Translation>,<ExternalUnit.Text>,<ExternalTranslation.Text> 

에 결과를 얻을하려는 Job 주어진 들어

enter image description here

내 데이터베이스에 이러한 기관이

이것은 내가 지금까지 잘 해낸 것입니다.

var props = session.QueryOver<Translation>(() => translation) 
      .Select(c => translation.Id, c => externalUnit.Text, c => externalTranslation.Text) 
      .JoinAlias(() => translation.TranslationUnit,() => unit)     
      .JoinAlias(() => unit.Job,() => job) 
      .Where(() => unit.Job == job) 
      .JoinAlias(() => job.ExternalUnits,() => externalUnit) 
      .JoinAlias(() => externalUnit.ExternalTranslations,() => externalTranslation) 
      .Where(() => externalUnit.Text == unit.Text) 
      .List<object[]>(); 

var translations = session.QueryOver<Translation>(() => translation)     
      .JoinAlias(() => translation.TranslationUnit,() => unit)     
      .JoinAlias(() => unit.Job,() => job) 
      .Where(() => unit.Job == job) 
      .JoinAlias(() => job.ExternalUnits,() => externalUnit) 
      .JoinAlias(() => externalUnit.ExternalTranslations,() => externalTranslation) 
      .Where(() => externalUnit.Text == unit.Text) 
      .List<Translation>() 
      .ToList(); 

그런 다음 props을 참조하여 translations을 반복합니다. 그러나 필자는 불필요하게 두 가지 (거의 동일한) 쿼리를 데이터베이스 대신 하나만 수행하기 때문에이 방법이 마음에 들지 않습니다.

그러나 원하는 투영을 얻을 수 없습니다. (그것이 나 전체 개체를 투영하는 것을 허용하지 않습니다) NHibernate에이 Select(() => translation...) 비트를 좋아하지 않는다, 분명히,

var data = session.QueryOver<Translation>(() => translationAlias)     
      .JoinAlias(() => translation.TranslationUnit,() => unit)     
      .JoinAlias(() => unit.Job,() => job) 
      .Where(() => unit.Job == job) 
      .JoinAlias(() => job.ExternalUnits,() => externalUnit) 
      .JoinAlias(() => externalUnit.ExternalTranslations,() => externalTranslation) 
      .Where(() => externalUnit.Text == unit.Text) 
      .Select(() => translation,() => externalUnit.Text,() => externalTranslation.Text) 
      .List() 

을하지만 :이처럼 뭔가에 대해 생각했다.

이상적으로

어떤 제안을 주셔서 대단히 감사합니다 ... 나는

var data = session.QueryOver<Translation>() 
      ... 
      .Select(() => new { A = translation, B = externalTranslation }) 

처럼 익명의 유형으로 선택하고 싶습니다하지만 난 NHibernate에 지금까지이없는 것 같아요.

답변

0

나는 그것을 얻었습니다! NHibernate의 LINQ 제공자가 나를 구해 주었다. 위대한 점은 익명 형식을 선택할 수 있다는 것입니다. 이렇게하면 쉽게 가입 할 수 있습니다. 이런 경우에 누군가가 여기 내 특별한 경우입니다, 호기심 : 그것은 생성하는 SQL은 매우 합리적이다

var q = 
(from c in 
    (from b in    
    (from translation in session.Query<Translation>() 
    join unit in units on translation.Unit equals unit 
    where unit.Job == job 
    select new { Translation = translation, Original = unit.Text })   
    join extUnit in externalUnits on job equals extUnit.Job 
    where extUnit.Text == b.Original 
    select new { Translation = b.Translation, ExternalUnit = extUnit }) 
join extTranslation in extTranslations on c.ExternalUnit equals extTranslation.Unit 
select new { Translation = c.Translation, Suggestion = extTranslation }) 
.ToList(); 

, 그래서 이것은 LINQ 기피 한 동안 나는, 감사

+0

쿨 : 매우 기쁘게 생각합니다 공급자가되었지만 지금은 앞으로 나아 갔다는 것을 알 수 있습니다. – Rippo

+0

@Rippo 재미있는 점은 나도 자신의 블로그에 질문하고 있다는 것입니다 : -P http://puredotnetcoder.blogspot.com/2011/07/queryover-with-multiple-joins-into-dto.html – twoflower

관련 문제