Доман:
class Action
Products: IList of class ActionProducts:
Category: class Category
Products: IList of class Product
Теперь я хочу это:
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;
И этот Linq на самом деле работает, но: 1. производит выбор для всех таблиц, а не только для продуктов 2. создает левые внешние объединения, а не внутренние 3. Distinct () в запросе не работает (хотя ToList (). Distinct ( ) работает).
Также может быть сделано с помощью SelectMany (a => a.Products) .SelectMany (ap => ap.Category.Products), но это не работает вообще с текущим NHibernate.Linq.
Итак, я хочу использовать ICriteria. Но я не вижу, как вернуть товар, а не действие?
ICriteria criteria = Session.CreateCriteria(typeof(Action))
.Add(Expression.Eq("Name", name))
.CreateAlias("Products", "ap")
.CreateAlias("ap.Category.Products", "p")
.SomehowReturnMeOnly("p");
Так как мне SomehowReturnMeOnly ("p")? Так что я могу сделать
return criteria.List<Product>();
что не получится, потому что ICriteria выбирает Действия, а не Продукты?
Я могу рассмотреть HQL, но на самом деле мне не нравятся строковые запросы ... Например, вот HQL, который работает и выдает именно тот SQL, который мне нужен:
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>();