Retorna a classe da coleção aninhada usando o NHibernate

Doman:

<code>class Action
    Products: IList of class ActionProducts: 
          Category: class Category
                Products: IList of class Product
</code>

Agora quero isso:

<code> var products = from a in Session.Linq<Action>()
                from ap in a.Products
                from p in ap.Category.Products
                where a.Name == name
                select p;
</code>

E este Linq realmente funciona, mas: 1. produz select para todas as tabelas em vez de apenas Products 2. produz junções externas à esquerda, não internas 3. Distinct () na consulta não funciona (embora ToList (). Distinct () funciona) .

Também pode ser feito com SelectMany (a => a.Products) .SelectMany (ap => ap.Category.Products) mas não funciona de todo com o atual NHibernate.Linq.

Então eu quero usar o ICriteria. Mas não consigo ver como devolvo produto, não ação?

<code> ICriteria criteria = Session.CreateCriteria(typeof(Action))
    .Add(Expression.Eq("Name", name))
    .CreateAlias("Products", "ap")
    .CreateAlias("ap.Category.Products", "p")
    .SomehowReturnMeOnly("p");
</code>

Então, como faço para o SomehowReturnMeOnly ("p")? Para que eu possa fazer

<code>return criteria.List<Product>();
</code>

que falhará porque o ICriteria seleciona Ações, não Produtos?

Eu posso considerar HQL, mas eu realmente não gosto de consultas de string ... Apenas por exemplo, aqui está o HQL que funciona e produz exatamente o SQL que eu preciso:

<code> IQuery query = Session.CreateQuery("select distinct p from Action a inner join a.Products as ap inner join ap.Category.Products as p");
 return query.List<Product>();
</code>

questionAnswers(3)

yourAnswerToTheQuestion