Nhibernate queryover 匹配两个 IEnumerable

Nhibernate queryover matching two IEnumerable

我有这个域对象:

public class Societa : EquatableObject<Societa>
{
    public virtual int IdSocieta { get; set; }
    public virtual string NomeSocieta { get; set; }
}

public class Attivita {
    public virtual int IdAttivita { get; set; }
    public virtual IEnumerable<ProcessoEsaminato> Processi
}

public class ProcessoEsaminato {
    public virtual ProcessoSocieta ProcessoCoperto { get; set; }
    public virtual int Anno { get; set; }
}

public class ProcessoSocieta {
    public override int Id { get; set; }
    public virtual Societa SocietaDiretta { get; set; }
    public virtual Societa SocietaService { get; set; }
}

public class Processo   {
    public virtual int Id { get; set; }
    public virtual string NomeProcesso { get; set; }
    public virtual IEnumerable<ProcessoSocieta> SocietaAttivate
}

我需要使用 QueryOver 或 LinqToNHibernate 从数据库中提取每个 ProcessAttivitaNomeProcessoSocietaDiretta.NomeSocietaSocietaService.NomeSocieta

所以我认为: 我必须从 Processo 开始,并获得那些在他们的 SocietaAttivate 中有一个在 AttivitaProcessi 集合中的那些,查看 ProcessoCoperto 属性 此集合的每个元素

我试试这个:

public IEnumerable<object> ProcessiPerAttivita (Attivita att) {     
    ProcessoSocieta ps = null;
    var elencoPS = att.Processi.Select(p => p.ProcessoCoperto).ToList<ProcessoSocieta>();

    return _session.QueryOver<Processo>()           
        .JoinAlias(processo => processo.SocietaAttivate, () => ps)
        .Where(x => x.SocietaAttivate.IsIn(elencoPS))
        .List();            
}

Where(x => x.SocietaAttivate.IsIn(elencoPS)) 不是我所需要的,因为它只需要一个 id 列表。所以第一个问题是我该怎么做?

第二个问题是我如何才能 select 我只需要来自不同对象的字段,来自不同的聚合级别?

编辑:

现在我试试

_session.QueryOver<Processo>()
            .JoinAlias(processo => processo.SocietaAttivate, () => ps)
            .Where(x => x.SocietaAttivate.Any(p => elencoPS.Contains(p)) != null)           
            .List();

但我得到 variable 'x' of type 'ProcessoSocieta' referenced from scope '', but it is not defined

试试这个:

    public IEnumerable<Processo> ProcessiPerAttivita (Attivita att) {     
    ProcessoSocieta ps = null;
    var elencoPS = att.Processi.Select(p => p.ProcessoCoperto).ToList<ProcessoSocieta>();

    return _session.QueryOver<Processo>()           
        .JoinAlias(processo => processo.SocietaAttivate, () => ps)
        .WhereRestrictionOn(processo  => ps.Id).IsIn(elencoPS.Select(el => el.Id).ToList())
        .List<Processo>();            
}

您必须使用 'ps' 别名!

编辑:您可以使用

.List<Processo>(); and return an IEnumerable<Processo>