Devuelve la clase de la colección anidada usando NHibernate
Doman:
<code>class Action Products: IList of class ActionProducts: Category: class Category Products: IList of class Product </code>
Ahora, quiero esto:
<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>
Y este Linq realmente funciona pero: 1. produce selección para todas las tablas en lugar de solo Productos 2. produce uniones externas izquierdas, no internas 3. La distinción () en la consulta no funciona (aunque ToList (). Distinta () funciona) .
También se puede hacer con SelectMany (a => a.Products) .SelectMany (ap => ap.Category.Products) pero no funciona en absoluto con NHibernate.Linq actual.
Por eso quiero usar ICriteria. ¿Pero no puedo ver cómo devuelvo el producto, no la acción?
<code> ICriteria criteria = Session.CreateCriteria(typeof(Action)) .Add(Expression.Eq("Name", name)) .CreateAlias("Products", "ap") .CreateAlias("ap.Category.Products", "p") .SomehowReturnMeOnly("p"); </code>
Entonces, ¿cómo puedo volver a MeMeOnly ("p")? Para que yo pueda hacer
<code>return criteria.List<Product>(); </code>
¿Cuál fallará porque ICriteria selecciona Acciones, no Productos?
Puedo considerar HQL pero en realidad no me gustan las consultas de cadenas ... Solo por ejemplo, aquí está el HQL que funciona y produce exactamente el SQL que necesito:
<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>