2011-01-16 4 views
11

私はNHibernateは3NHibernateは3 - 左が再LINQのソリューションを参加

して以下
var items = from c in session.Query<tbla>() 
     join t in session.Query<tblb>() on c.Id equals t.SomeId into t1 // use left join on trades. 
     from t2 in t1.DefaultIfEmpty() 
select new {item = c, desc = t2.Description}; 

このLINQクエリを実行するために、これは私の知る限り、LINQに参加左を実行するための株式の方法ですしようとしています。しかし、それは私にサポートされていない例外メッセージを与えています。 HQLに頼らずに基本的な左結合を達成するにはどうすればよいですか?これは、nHibernateのような普及しているORMが、左の結合として歩行者として何かをサポートすることができないということはやや馬鹿げているようです。

[編集]

私は以下の自分の質問に本当の答えを入れました。

+0

私は迷っています。この例の「c.Id上のt.omeIdとt1との等価」と「new {item = c、desc = t2.Description}」はどこにありますか?あなたは例やコメントを拡張できますか? – mayu

+0

回答が間違っています。どうしてあなた自身の答えを提出しないのですか?私はそれに投票するだろう。 – mayu

+0

よろしくお願いします。私の編集内容を回答に移動しました。結合マジックは、その式の 'SelectList'節で起こります。うまくいけば助けてくれます。 2番目のクエリーは、最初のクエリーで完全に論理的に一致するロジックではないため、リンゴとリンゴの比較はありません。 – James

答えて

8

これについてさらに調査した後、 QueryOverを使用して厳密に型指定された方法で達成することは可能です(明らかではありませんが)。この手法は、WithAliasとTransformUsingを組み合わせて外部Queryエイリアス変数を使用することです。ここでは、フィルタリングと並べ替えを使用して結合を残す例を示します。

// Query alias variables 
entityTypeA anchorType = null; 
entityTypeB joinedType = null; 

var items = session.Query<entityTypeA>(()=>anchorType) 
      .Left.JoinAlias(() => anchorType.FieldName,() => joinedType) 
      .WithSubquery.WhereProperty(e => e.FieldD).In(myFilterList) 
      // bind property mappings using WithAlias 
      .SelectList(list => list 
         .Select(e => e.FieldNameA).WithAlias(()=> anchorType.FieldNameA) 
         .Select(e => e.FieldNameB).WithAlias(()=> anchorType.FieldNameB) 
         ) 
      .OrderBy(e => joinedType.FieldNameC).Desc 
      .TransformUsing(Transformers.AliasToBean<entityTypeA>()) // transform result to desired type. 
      .List<entityTypeA>(); 
+1

そのアプローチには1つの問題があります:取得したエンティティは実際にはDTOのよ​​うに振る舞います(つまり、追跡されません)。 –

+0

更新されたこのソリューションは動作しませんか? –

1

まだサポートされていません。現在のところ、HQLはあなたの唯一の選択肢です。

+0

ありがとう、私はそれを恐れていました。おそらくこれを行う別の非hqlの別の方法ですか?つまり、サブクエリw /どこで外側の節など? – James

+1

多分...複雑なLINQの代わりに単純なHQLを使用します... –

関連する問題