Вернуть класс из вложенной коллекции, используя NHibernate

Доман:

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

Теперь я хочу это:

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

И этот Linq на самом деле работает, но: 1. производит выбор для всех таблиц, а не только для продуктов 2. создает левые внешние объединения, а не внутренние 3. Distinct () в запросе не работает (хотя ToList (). Distinct () работает) ,

Также это можно сделать с помощью SelectMany (a = & gt; a.Products) .SelectMany (ap = & gt; ap.Category.Products), но он вообще не работает с текущим NHibernate.Linq.

Поэтому я хочу использовать ICriteria. Но я не вижу, как вернуть товар, а не действие?

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

Так как же мне SomehowReturnMeOnly (& quot; p & quot;)? Так что я могу сделать

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

что не удастся, потому что ICriteria выбирает действия, а не продукты?

Я могу рассмотреть HQL, но на самом деле мне не нравятся строковые запросы ... Например, вот тот HQL, который работает и выдает именно тот SQL, который мне нужен:

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

Ответы на вопрос(3)

Ваш ответ на вопрос