Nhibernate 添加附加条件以联接而非WHERE子句

Nhibernate 添加附加条件以联接而非WHERE子句,nhibernate,Nhibernate,几天来,我一直在尝试使用QueryOver来实现这一点,但没有取得多大进展。我似乎找不到在一对多关系的左外连接上添加条件的方法。我有问答实体,一个问题有多个答案(用于调查,每个答案都是同一问题的另一个答案)。我试图根据一些标准筛选所有答案(例如,分数q.Survey.Id==Id) .Left.JoinQueryOver(q=>q.Answers) .其中(a=>a.得分questionAlias) .其中(q=>q.Survey.Id==Id) .Left.JoinAlias(()=>ques

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

示例实体 问题:

public class Question : Entity<int>
{
    public virtual IEnumerable<Answer> Answers { get; set; }
    ...
}
公共类问题:实体
{
公共虚拟IEnumerable答案{get;set;}
...
}
答复:

public class Answer : Entity<int>
{
    public virtual Question Question { get; set; }
    public virtual int Score { get; set; }
    ...
}
公共类答案:实体
{
公共虚拟问题{get;set;}
公共虚拟整数分数{get;set;}
...
}
询问 我尝试过使用JoinQueryOver的许多不同变体

session.QueryOver<Question>()
    .Where(q => q.Survey.Id == id)
    .Left.JoinQueryOver(q => q.Answers)
    .Where(a => a.Score < 3)
session.QueryOver()
.其中(q=>q.Survey.Id==Id)
.Left.JoinQueryOver(q=>q.Answers)
.其中(a=>a.得分<3)
…和JoinAlias,并在其中使用别名

session.QueryOver<Question>(() => questionAlias)
    .Where(q => q.Survey.Id == id)
    .Left.JoinAlias(() => questionAlias.Answers, () => answerAlias)
    .Where(() => answerAlias.Score > 3);
session.QueryOver(()=>questionAlias)
.其中(q=>q.Survey.Id==Id)
.Left.JoinAlias(()=>questionAlias.Answers,()=>answerAlias)
其中(()=>回答别名.得分>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
从问题q中选择*
左外连接回答a关于q.Id=a.Question\U Id
其中q.Survey_id=1,a.得分<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
从问题q中选择*
左外连接回答a关于q.Id=a.问题Id和a.分数<3
其中q.Survey_id=1

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

from Question q
left join q.Answers a with a.Score < 3
where q.Survey.Id = :id
来自问题q的

左连接q.回答a,a.分数<3
其中q.Survey.Id=:Id

(未测试)

原来我使用的是一个旧版本的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);
应答应答别名=null;
var questionQuery=session.QueryOver()
.其中(q=>q.Survey.Id==Id)
.Left.JoinQueryOver(q=>q.Answers,()=>answerAlias,a=>a.Score>3);

我相信从3.2开始这一点就得到了支持(关于这一点的公认答案是我得到的消息)

Hmm,我试图过滤每个问题的答案集,但仍然返回问题。有没有其他方法可以做到这一点,比如使用子查询?换句话说,我不想要问题。惰性答案加载所有答案,但过滤它们的子集。不能将不完整的集合作为实体的一部分返回。改为使用投影,或者先加载问题,然后使用
session.Filter(Question.Answers,“where Score<3”)
获得过滤后的答案子集。我希望我能找到最喜欢的答案。这对我帮助很大,谢谢!很高兴我找到了这个答案,这正是我一直在寻找的,非常感谢对世界上所有正确事物的爱!非常感谢。我非常希望nhibernate文档更好。