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>