为JOIN而不是WHERE子句添加附加条件

时间:2012-06-26 20:49:54

标签: nhibernate

我一直在尝试使用QueryOver完成此操作几天而没有太大进展。我似乎找不到在一对多关系上为左外连接添加条件的方法。我有问答实体,其中一个问题有多个答案(这是一个调查,其中每个答案是同一个问题的另一个答案)。我正在尝试根据某些条件过滤所有答案(例如,所有答案的分数< 3),但无论何时我尝试添加条件,它都会被添加到WHERE子句而不是JOIN。 / p>

示例实体

问题:

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

2 个答案:

答案 0 :(得分:10)

原来我使用的是旧版本的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开始就支持此功能(此question上接受的答案是让我失望的原因)

答案 1 :(得分:0)

IIRC,唯一支持此功能的查询API是HQL:

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

(未测试的)