我一直试图使用QueryOver完成这几天没有太大进展.我似乎找不到在一对多关系上为左外连接添加条件的方法.我有问答实体,其中一个问题有多个答案(这是一个调查,其中每个答案是同一个问题的另一个答案).我试图根据一些标准过滤所有的答案(例如,所有得分<3的答案),但是当我尝试添加条件时,它会被添加到WHERE子句而不是JOIN.
题:
public class Question : Entity<int>
{
public virtual IEnumerable<Answer> Answers { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
回答:
public class Answer : Entity<int>
{
public virtual Question Question { get; set; }
public virtual int Score { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用JoinQueryOver的许多不同变体......
session.QueryOver<Question>()
.Where(q => q.Survey.Id == id)
.Left.JoinQueryOver(q => q.Answers)
.Where(a => a.Score < 3)
Run Code Online (Sandbox Code Playgroud)
...和JoinAlias并使用Where中的别名
session.QueryOver<Question>(() => questionAlias)
.Where(q => q.Survey.Id == id)
.Left.JoinAlias(() => questionAlias.Answers, () => answerAlias)
.Where(() => answerAlias.Score > 3);
Run Code Online (Sandbox Code Playgroud)
我总是得到这样的查询:
SELECT * FROM QUESTION q
left outer join ANSWER a on q.Id=a.Question_id
WHERE q.Survey_id = 1 and a.Score < 3
Run Code Online (Sandbox Code Playgroud)
但是我需要:
SELECT * FROM QUESTION q
left outer join ANSWER a on q.Id=a.Question_id and a.Score < 3
WHERE q.Survey_id = 1
Run Code Online (Sandbox Code Playgroud)
Sea*_*nch 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);
Run Code Online (Sandbox Code Playgroud)
我相信从3.2开始就支持这个问题(在这个问题上接受的答案是让我失望的)
| 归档时间: |
|
| 查看次数: |
4004 次 |
| 最近记录: |