我有简单的sql,我想在nhibernate查询中锻炼:
select distinct sel.* from
v_groups sel
inner join v_groups restr on sel.Nr = restr.Nr
Where restr.ID in (1,2,3)
编辑:这可以用子查询重写:
select distinct sel.* from
v_groups sel
Where
sel.Nr in (select restr.Nr from v_groups restr where restr.ID in (1,2,3))
我设法做到了:
var query = voUnitWork.Session
.QueryOver<v_groups>()
.WhereRestrictionOn(c => c.ID).IsIn(1, 2, 3)
.OrderBy(c => c.Nr).Asc
.List<v_groups>();
我需要添加JoinAlias
但无法找到正常工作的方法。这种查询的任何提示或良好的教程?我错过了什么?
public class v_groups
{
public virtual int ID { get; set; }
public virtual string user { get; set; }
public virtual string Nr { get; set; } //user group number
}
答案 0 :(得分:1)
使用NHibernate.Linq
代替QueryOver
,我会尝试:
using NHibernate.Linq;
using System.Linq;
...
var ids = new [] { 1, 2, 3 };
var v_groupsQuery = voUnitWork.Session.Query<v_groups>();
var query = v_groupsQuery
.Where(v =>
v_groupsQuery
.Where(g => ids.Contains(g.ID))
.Select(g => g.Nr)
.Distinct()
.Contains(v.Nr))
.ToList();
抱歉,我不习惯QueryOver
。我使用Linq或HQL。
答案 1 :(得分:1)
您可以使用子查询来实现它。与@Frédéric相同的想法,但使用QueryOver
var subquery = QueryOver.Of<v_groups>()
.WhereRestrictionOn(u => u.ID).IsIn(new[] { 1, 2, 3 })
.Select(u => u.Nr);
var query = voUnitWork.Session
.QueryOver<v_groups>()
.WithSubquery.WhereProperty(g => g.Nr).In(subquery)
.OrderBy(c => c.Nr).Asc
.List<v_groups>();