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从db中提取Attivita
与NomeProcesso
,SocietaDiretta.NomeSocieta
和SocietaService.NomeSocieta
i nedd to extract from db with QueryOver or LinqToNHibernate every Process
of an Attivita
with NomeProcesso
, SocietaDiretta.NomeSocieta
and SocietaService.NomeSocieta
所以我认为:
我必须从Processo
开始,并在其SocietaAttivate
中具有Attivita
的Processi
集合中的那些,并查看该集合中每个元素的ProcessoCoperto
属性
So i think:
i have to start from Processo
and get those that in their SocietaAttivate
has one that is in Processi
collection of Attivita
, looking at ProcessoCoperto
property of every element of this collection
我试试这个:
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列表.所以第一个问题是我该怎么做?
but Where(x => x.SocietaAttivate.IsIn(elencoPS))
is not what i nedd, since it wants only a list of id. so first question is how can i do this?
第二个问题是如何从不同聚合级别的不同对象中仅选择我需要的字段?
Second question is how can i select only fields i need from different object, coming from different level of aggregation?
现在我尝试
_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"别名!
You must use the 'ps' alias!
您可以使用
.List<Processo>(); and return an IEnumerable<Processo>
这篇关于Nhibernate queryover匹配两个IEnumerable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!