2015-11-09 3 views
0

Мне нужна помощь в настройке запроса Nhibernate.Настройка nHibernate Query

У меня есть два объекта

public class Parent 
{  
    public int Id {get; set; }  
    public List<Child> Childs {get; set; } 
} 

public class Child 
{ 
    public int ChildId {get; set;} 
    public Parent Parent {get; set;} 
} 

мне нужно возвращать список, который является выбором всех дочерних списков всех родителей. Итак, я сделал это так.

public IList<Child> GetChilds(IEnumerable<Parent> parents) 
{ 
    var data = this.Sessao.QueryOver<Parent>() 
          .Where(Restrictions.In("Parent.Id", parents.Select(x => x.Id).ToList())) 
          .List(); 

    var childs = new List<Child>(); 

    foreach (var parent in data) 
    { 
     childs.AddRange(parent.childs); 
    } 

    return childs; 
} 

Это работает, но это генерируя выбрать, чтобы получить родитель плюс п выбирает получить Чайлдс, и я думаю, что это можно получить весь Чайлдс только один запрос.

+0

Является ли родитель равным отношением? Другими словами, требуется ли у ребенка родитель? –

+0

Да, требуется, чтобы у ребенка был родитель. – Jedi31

ответ

1

Вы можете сделать это с поставщиком Linq, как это:

public IList<Child> GetChilds(IEnumerable<Parent> parents) 
{ 
    return this.Sessao.Query<Child>() 
         .Where(x => parents.Select(x => x.Id).ToList().Contains(x.Parent.Id)) 
         .List(); 
} 

или что-то подобное с поставщиком QueryOver:

public IList<Child> GetChilds(IEnumerable<Parent> parents) 
{ 
    Parent parentAlias = null; 
    this.Sessao.QueryOver<Wave>() 
      .Inner.JoinAlias(x => x.Parent,() => parentAlias) 
      .WhereRestrictionOn(() => parentAlias.Id).IsIn(parents.Select(x => x.Id).ToList()) 
} 

Приведенные выше примеры являются псевдокод, поэтому они не могут быть точными, но должно быть очень близко.

+0

Хорошо ... Он отлично работает! благодаря – Jedi31

Смежные вопросы