Comment interroger une sous avec api de critères de NHibernate et l'entité à ne charger que les sous-propriétés correspondant à une condition sous-jacente

StackOverflow https://stackoverflow.com/questions/1164371

  •  18-09-2019
  •  | 
  •  

Question

En supposant ce qui suit:

public class Order
{
   public virtual int OrderId {get;set}
   public virtual ISet<Product> Products {get;set}
}

public class Product
{
   public virtual int ProductId {get;set}
   public virtual string ProductName {get;set}
}

Comment vous interroger à l'aide de critères api de sorte que seule une commande avec un orderid spécifique est retourné et sa collection de produit doit également être filtré vers le bas pour les produits dont le nom commence par la lettter P?

Était-ce utile?

La solution

Je voudrais aller à ce sujet avec un DetachedCriteria:

DetachedCriteria crit = DetachedCriteria.For<Order>();

crit.Add(Restrictions.Eq("OrderId",orderID);
crit.CreateCriteria("Products","products");
crit.Add(Restrictions.Like("products.ProductName","P%");

crit.List();

puis exécuter les critères et obtenir les résultats.

Autres conseils

approche plus simple est d'utiliser un alias:

var productIdToSelect = 9;
var crit = Session.CreateCriteria(typeof(Order));
crit.CreateAlias("Product", "prod");
crit.Add(Expression.Eq("prod.Id", productIdToSelect));
var result = crit.List<Order>();

Je ne sais pas le code que vous auriez à écrire, mais un point dans la bonne direction:

http://www.nhforge.org/doc /nh/en/index.html#querycriteria-associations (14,4)

La clé semble être:

.SetResultTransformer(CriteriaUtil.AliasToEntityMap)

La documentation montre un exemple avec les chats et les chatons.

  

Notez que les chatons collections détenues par les instances de Cat retournées par les deux précédentes requêtes ne sont pas pré-filtrées par les critères! Si vous souhaitez récupérer uniquement les chatons qui correspondent aux critères, vous devez utiliser SetResultTransformer (CriteriaUtil.AliasToEntityMap).

Mise en place d'un filtre sur la cartographie de la collection.

<filter name="letterFilter" condition="ProductName like ':letterSupplied'"/>

Alors avant d'exécuter la requête de la commande activer le filtre

session.EnableFilter("letterFilter").SetParameter("letterSupplied", "P%");

puis exécutez la requête

Order ord = session.CreateCriteria<Order>().Add(Restrictions.IdEq(suppliedId)).UniqueResult<Order>();

Notez que les guillemets simples dans la définition du filtre ne peut être nécessaire et aussi je placer le symbole% avec le paramètre fourni comme je ne sais pas comment NH réagirait un filtre comme

<filter name="letterFilter" condition="ProductName like ':letterSupplied%'"/>

ou

<filter name="letterFilter" condition="ProductName like :letterSupplied%"/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top