5

QueryOver を使用して数日間これを達成しようとしましたが、あまり進歩がありませんでした。1 対多の関係の左外部結合に条件を追加する方法が見つからないようです。質問に複数の回答がある質問と回答のエンティティがあります(各回答が同じ質問に対する別の回答である調査用です)。いくつかの基準 (スコアが 3 未満のすべての回答など) に基づいてすべての回答をフィルター処理しようとしていますが、条件を追加しようとすると、JOIN ではなく WHERE 句に追加されます。

エンティティの例

質問:

public class Question : Entity<int>
{
    public virtual IEnumerable<Answer> Answers { get; set; }
    ...
}

答え:

public class Answer : Entity<int>
{
    public virtual Question Question { get; set; }
    public virtual int Score { get; set; }
    ...
}

クエリ

JoinQueryOver を使用するさまざまなバリエーションを試しました...

session.QueryOver<Question>()
    .Where(q => q.Survey.Id == id)
    .Left.JoinQueryOver(q => q.Answers)
    .Where(a => a.Score < 3)

...そして JoinAlias と Where でのエイリアスの使用

session.QueryOver<Question>(() => questionAlias)
    .Where(q => q.Survey.Id == id)
    .Left.JoinAlias(() => questionAlias.Answers, () => answerAlias)
    .Where(() => answerAlias.Score > 3);

私はいつも次のようなクエリを受け取ります:

SELECT * FROM QUESTION q
left outer join ANSWER a on q.Id=a.Question_id
WHERE q.Survey_id = 1 and a.Score < 3

しかし、私は必要です:

SELECT * FROM QUESTION q
left outer join ANSWER a on q.Id=a.Question_id and a.Score < 3
WHERE q.Survey_id = 1
4

2 に答える 2

11

これをサポートしていない古いバージョンの NHibernate (3.1) を使用していたことが判明しましたが、3.3 にアップグレードすると、渡せる withClause が追加されました。

Answer answerAlias = null;
var questionQuery = session.QueryOver<Question>()
    .Where(q => q.Survey.Id == id)
    .Left.JoinQueryOver(q => q.Answers, () => answerAlias, a => a.Score > 3);

これは3.2の時点でサポートされていると思います(この質問に対する受け入れられた回答が私をひっくり返したものです)

于 2012-06-27T13:42:12.813 に答える
0

IIRC、これをサポートする唯一のクエリAPIはHQLです。

from Question q
left join q.Answers a with a.Score < 3
where q.Survey.Id = :id

(未テスト)

于 2012-06-27T02:13:28.440 に答える