Zwróć klasę z zagnieżdżonej kolekcji za pomocą NHibernate

Doman:

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

Teraz chcę tego:

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

A ten Linq działa, ale: 1. produkuje select dla wszystkich tabel zamiast tylko Produktów 2. produkuje lewe złączenia zewnętrzne, nie wewnętrzne 3. Distinct () na kwerendzie nie działa (chociaż ToList (). Rozróżnia () działa) .

Można to również zrobić za pomocą SelectMany (a => a.Products) .SelectMany (ap => ap.Category.Products), ale w ogóle nie działa z obecnym NHibernate.Linq.

Chcę więc użyć ICriteria. Ale nie widzę, jak mogę zwrócić produkt, a nie działanie?

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

Jak więc mam SomehowReturnMeOnly („p”)? Więc mogę to zrobić

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

co nie powiedzie się, ponieważ ICriteria wybiera Akcje, a nie Produkty?

Mogę rozważyć HQL, ale tak naprawdę nie lubię zapytań łańcuchowych ... Na przykład, tutaj jest HQL, który działa i produkuje dokładnie SQL, którego potrzebuję:

<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