2011-08-06 14 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(); 

translationsをループし、propsを参照してください。しかし、私は不必要に2つ(ほとんど同一)のクエリを1つではなくデータベースに実行するので、このアプローチは嫌いです。

しかし、私は希望の投影を得ることができません。私はこのような何かを考えていた:

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() 

しかし、明らかに、NHibernateのは(それは私が全体のエンティティを投影することはできません)Select(() => translation...)ビットが好きではありません。

理想的には私が

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

関連する問題