【问题标题】:Add additional conditional to JOIN and not WHERE clause向 JOIN 而不是 WHERE 子句添加附加条件
【发布时间】:2012-06-28 06:21:59
【问题描述】:

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

示例实体

问题:

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

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    原来我使用的是不支持此功能的旧版本 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 上的公认答案是我的提示)

    【讨论】:

    • 我希望我能最喜欢的答案。这对我帮助很大,谢谢!
    • 很高兴我找到了这个答案,正是我一直在寻找的,非常感谢
    • 为了世界上所有正确的人的爱!谢谢!我真希望 nhibernate 文档更好。
    【解决方案2】:

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

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

    (未经测试)

    【讨论】:

    • 嗯,我正在尝试过滤每个问题的答案集合,但仍然返回问题。还有另一种方法可以使用子查询吗?换句话说,我不希望 question.Answers 延迟加载所有答案,而是过滤它们的子集。
    • 您不能将不完整的集合作为实体的一部分返回。改用投影,或先加载问题,然后使用session.Filter(question.Answers, "where Score &lt; 3") 来获取过滤后的答案子集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2010-12-09
    • 1970-01-01
    • 2016-12-16
    • 2021-04-09
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多