2010-11-25 9 views
5

に参加する:NHibernateは3のLINQ - インナー私はNHibernateは3 CRをテストが、LINQのを使用して、次のSQLを作成するために失敗してる

select * 
    from  Users    as {user} 
    inner join Test    as test on test.UserId = user.Id 
    inner join Release    as release on release.TestId = test.TestId 
    where Release.Status = 1 
    order by count(release.Status) desc; 

私がこれまで持っていない、私の現在のコードは次のようであると示します私は別の完全な何か:

var users = from user in Session.Query<User>() 
      join test in Session.Query<Test>() on user.Id equals test.User.Id 
      join release in Session.Query<Release>() on test.Id equals release.Test.Id 
      where release.Status == 1 
      orderby release.Status 
      descending 
      select user; 

linqで内部結合を使用する方法に関するリソースはありますか?そして、どうすればいいですか:

order by count(release.Status) 

これは代わりにQueryOverで行う必要がありますか?

+1

マッピングではなくクエリでエンティティ間の関係を定義するのはなぜですか? – Paco

+0

私はちょうど従来のアプリケーションでlinqをテストしていました。これはSQLのように見えます。私はマッピングの書き換えを聞くことができますが、ここでのポイントは、Linqがnhibernateまでどのくらい遠くまで進化したかを見ることでした。それはあまり役に立たないようです。 – bondehagen

答えて

4

AFAIK、NHはlinq wellの結合をまだサポートしていません。 HQLやQueryOverを使う方が良いです(私は単純なクエリでは最高です)。この例を見てください。

// just to assign aliases, not for real use: 
Test qtest = null; 
Release qrel = null; 

// do query 
var data = Session.QueryOver<User>() 
    .JoinAlias(quser => quser.Tests,() => qtest) 
    .JoinAlias(quser => quser.Releases,() => qrel) 
    .Where(() => qrel.Status == 1) 
    .OrderBy(() => qrel.Status).Desc 
    .List(); 
6

まず、idで結合しようとするのではなく、モデルで関係を定義します。

次に、あなたがこれを行うことができるようになります:

from release in session.Query<Release>() 
where release.Status == 1 
select release.Test.User 

すべてのことが欠けていますが、私は(あなたが集計で注文しようとしているが、あなたはしている正しいとは思わないORDERBY、ありますグループを指定しないで)

+0

これは暗黙の外部結合を引き起こし、インナー結合として有効ではありません –

+0

@Saeed:関連性のあるプロファイリングセッションを表示します。 –

+0

私は現在見ていませんでしたが、どのように作品から知っています。 –

関連する問題