5

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

示例实体

问题:

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 回答