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 从数据库中提取每个 Process
的 Attivita
与 NomeProcesso
、SocietaDiretta.NomeSocieta
和 SocietaService.NomeSocieta
所以我认为:
我必须从 Processo
开始,并获得那些在他们的 SocietaAttivate
中有一个在 Attivita
的 Processi
集合中的那些,查看 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>
我有这个域对象:
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 从数据库中提取每个 Process
的 Attivita
与 NomeProcesso
、SocietaDiretta.NomeSocieta
和 SocietaService.NomeSocieta
所以我认为:
我必须从 Processo
开始,并获得那些在他们的 SocietaAttivate
中有一个在 Attivita
的 Processi
集合中的那些,查看 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>