Rückgabe der Klasse aus der verschachtelten Sammlung mit NHibernate

Doman:

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

Nun möchte ich Folgendes:

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

Und dieser Linq funktioniert tatsächlich, aber: 1. erzeugt select für alle Tabellen anstelle von nur Products 2. erzeugt left outer joins, nicht inner 3. Distinct () in der Abfrage funktioniert nicht (obwohl ToList (). Distinct () funktioniert) .

Kann auch mit SelectMany (a => a.Products) .SelectMany (ap => ap.Category.Products) durchgeführt werden, funktioniert aber mit dem aktuellen NHibernate.Linq überhaupt nicht.

Also möchte ich ICriteria verwenden. Aber ich kann nicht sehen, wie ich das Produkt zurückschicke, nicht die Aktion?

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

Wie kann ich "SomehowReturnMeOnly" ("p")? Damit ich das machen kann

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

Was wird scheitern, weil ICriteria Aktionen und nicht Produkte auswählt?

Ich mag HQL in Betracht ziehen, aber ich mag keine String-Abfragen ... Zum Beispiel ist hier das HQL, das genau das SQL erzeugt, das ich brauche:

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage