Doman:classe de retour de la collection nichée en utilisant NHibernate
class Action
Products: IList of class ActionProducts:
Category: class Category
Products: IList of class Product
Maintenant, je veux ceci:
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;
Et ce Linq fonctionne réellement, mais: 1. produit de sélection pour toutes les tables au lieu de seulement les produits 2. produit des jointures externes gauche, pas interne 3. Distinct() sur la requête ne fonctionne pas (bien que ToList() .Distinct() fonctionne).
Peut également être fait avec SelectMany (a => a.Products) .SelectMany (ap => ap.Category.Products) mais il ne fonctionne pas du tout avec NHibernate.Linq actuel. Donc je veux utiliser ICriteria. Mais je ne peux pas voir comment je retourne le produit, pas l'action?
ICriteria criteria = Session.CreateCriteria(typeof(Action))
.Add(Expression.Eq("Name", name))
.CreateAlias("Products", "ap")
.CreateAlias("ap.Category.Products", "p")
.SomehowReturnMeOnly("p");
Alors, comment puis-je effectuer une opération SomeReturnMeOnly ("p")? Alors que je peux faire
return criteria.List<Product>();
qui échouera parce que ICriteria sélectionne des actions, pas des produits?
je considérer HQL mais je ne fait pas comme les requêtes de chaîne ... Juste par exemple, voici la HQL qui fonctionne et produit exactement le SQL que j'ai besoin:
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>();
Eh bien j'ai essayé beaucoup de projections là-bas, aussi des listes de projections, avec CreateCriteria au lieu de Alias, aussi ... tout ne fonctionne pas. Voici l'exception typique (pour votre code): NHibernate.QueryException: n'a pas pu résoudre la propriété: Category.Products de: OrderEntry3.Core.ActionProduct – queen3