2016-10-21 23 views
0

我有此域中的對象: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 
} 

我NEDD從分貝QueryOver或LinqToNHibernate一個AttivitaNomeProcessoSocietaDiretta.NomeSocietaSocietaService.NomeSocieta

的每Process所以我想提取: 我不得不從Processo開始,讓那些在他們的SocietaAttivate有一個是在Processi收集Attivita,看着這個集合

的每一個元素的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))不是我NEDD,因爲它想只是一個ID列表。所以第一個問題是我該如何做到這一點?

第二個問題是,我怎麼能只選擇我從不同的對象需要領域,從不同層次聚集來了嗎?

編輯:

現在我嘗試

_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

回答

1

試試這個:

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> 
+0

。凡(X => ps.SocietaAttivate.IsIn(elencoPS))不編譯,因爲我嘗試同時ISIN只有不與對象集合 –

+0

更新工作,嘗試使用上面的代碼 –

+0

太棒了! WhereRestrictionOn和Where有什麼區別? –