2016-10-21 34 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 каждый Process из Attivita с NomeProcesso, SocietaDiretta.NomeSocieta и SocietaService.NomeSocieta

Так я думаю: Я должен начать с 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, так как он хочет только список ид. поэтому первый вопрос: как я могу это сделать?

Второй вопрос: как я могу выбрать только поля, которые мне нужны из разных объектов, исходя из разных уровней агрегации?

EDIT:

Сейчас я стараюсь

_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>();    
} 

Вы должны использовать 'пс' псевдоним!

Edit: вы можете использовать

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

.гда (х => ps.SocietaAttivate.IsIn (elencoPS)) не компилировать и, как я стараюсь тем время ISIN только не работает с объектом сбор –

+0

Обновлен, попробуйте с кодом выше –

+0

отлично! какая разница между WhereRestrictionOn и Where? –