nhibernate选择交叉连接与同一个表

时间:2016-03-07 12:34:42

标签: c# nhibernate

我有简单的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
}

2 个答案:

答案 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>();