2016-04-06 4 views
0

У меня есть следующие объектыNHibernate фильтр Гранд коллекция детей

public class Parent { 
    int Id; 
    Object Obj1; 
    Object Obj2; 
    DateTime Date1; 
    IList<Child> Children; 
} 

public class Child { 
    int Id; 
    Parent Parent; 
    IList<GrandChild> GrandChildren; 
} 

public class GrandChild { 
    int Id; 
    Child Child; 
    DateTime Date2; 
} 

Мне нужно ограничить список внучат по Date2. Я пробовал следующее:

Parent parentAlias = null; 
Child childAlias = null; 
GrandChild grandChildAlias = null; 

ICriterion dateCriterion = Restrictions.Where<GrandChild>(
    g => g.Date2.Date >= fromDate && g.Date2.Date <= toDate 
); 

var query = QueryOver.Of(() => parentAlias) 
    .Inner.JoinAlias(() => parentAlias.Children,() => childAlias) 
    .Inner.JoinAlias(() => childAlias.GrandChildren,() => grandChildAlias, dateCriterion) 
    .Where(p => p.Obj1.Id == param1 && p.Obj2.Id == param2 && p.Date1 == paramDate); 

var result = query.GetExecutableQueryOver(session).SingleOrDefault(); 

Однако это не фильтрует грандиозную детскую коллекцию.

Ваш ввод очень приветствуется.

спасибо.

ответ

0

Afeter немного больше исследований, все, что я имел чтобы сделать это, изменили великого ребенка Inner to Left и получили желаемый эффект.

var query = QueryOver.Of(() => parentAlias) 
    .Inner.JoinAlias(() => parentAlias.Children,() => childAlias) 
    .Left.JoinAlias(() => childAlias.GrandChildren,() => grandChildAlias, dateCriterion) 
    .Where(p => p.Obj1.Id == param1 && p.Obj2.Id == param2 && p.Date1 == paramDate); 

Это ограничило элементы списка GrandChild в списке объектов Child теми, что были между датами.

Надеюсь, это поможет.

1

Если вы хотите отфильтрованную коллекцию, вы должны запросить непосредственно на GrandChildren и вернуть список этих объектов. Вы можете присоединиться к родителям и выбрать список тех, кто в LINQ после того, как принес все Grandchildren

Вы также можете быть в состоянии проверить эту статью, если это не работает для вас: NHibernate - Retrieve parent/children with criteria applied only to children

0

Я не уверен, в чем проблема. Вероятно, вы ожидаете, что списки будут отфильтрованы. Это не тот случай. Объекты всегда возвращаются полностью. Ваш запрос, как и у вас, - это фильтрация родителей по свойствам как минимум одного великих детей, всегда возвращающих полные объекты.

(Если бы это было по-другому, было бы странно добавлять детей в список фильтрованных объектов. Объекты, возвращаемые ORM, предназначены для работы в режиме ООП, а не только для чтения данных, возвращаемых SQL, например.)

Вы можете начать запрос с детей-девайсов, получив (плоский) список фильтрованных детей. От каждого ребенка, вы могли бы перейти к родителям по своим свойствам:

var query = QueryOver.Of<GrandChild>() 
    .Where(p => p.Obj1.Id == param1 && p.Obj2.Id == param2 && p.Date1 == paramDate); 

Когда в настоящее время навигации обратно к родителям, вы найдете их завершения снова:

var countAllSiblings = queriedGrandChild.Child.GrandChildren.Count() 
Смежные вопросы