Nhibernate queryover匹配两个IEnumerable [英] Nhibernate queryover matching two IEnumerable

查看:54
本文介绍了Nhibernate queryover匹配两个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中提取AttivitaNomeProcessoSocietaDiretta.NomeSocietaSocietaService.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中具有AttivitaProcessi集合中的那些,并查看该集合中每个元素的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆