Devuelve la clase de la colección anidada usando NHibernate

Doman:

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

Ahora, quiero esto:

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

Y este Linq realmente funciona pero: 1. produce selección para todas las tablas en lugar de solo Productos 2. produce uniones externas izquierdas, no internas 3. La distinción () en la consulta no funciona (aunque ToList (). Distinta () funciona) .

También se puede hacer con SelectMany (a => a.Products) .SelectMany (ap => ap.Category.Products) pero no funciona en absoluto con NHibernate.Linq actual.

Por eso quiero usar ICriteria. ¿Pero no puedo ver cómo devuelvo el producto, no la acción?

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

Entonces, ¿cómo puedo volver a MeMeOnly ("p")? Para que yo pueda hacer

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

¿Cuál fallará porque ICriteria selecciona Acciones, no Productos?

Puedo considerar HQL pero en realidad no me gustan las consultas de cadenas ... Solo por ejemplo, aquí está el HQL que funciona y produce exactamente el SQL que necesito:

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta