2008-12-15 3 views
0

J'ai une classe de produit qui a un rapport de un à plusieurs avec une classe de prix. Ainsi, un produit peut avoir plusieurs prix.Comment définir le résultat de retour maximal pour plusieurs-à-un

Je dois interroger le db pour me procurer 10 produits qui ont Price.amount < $ 2. Dans ce cas, il s'agit de remplir une interface utilisateur avec 10 éléments dans une page. donc je bref le code suivant:

ICriteria criteria = session.CreateCriteria(typeof(Product)); 

criteria.SetFirstResult(pageNumber); 
criteria.SetMaxResults(numberOfItemInPage); 

criteria = criteria.CreateCriteria("PriceCollection"); 
criteria.Add(Restrictions.Le("Amount", new Decimal(2))); 
criteria.SetResultTransformer(CriteriaSpecification.DistinctRootEntity); 

Au lieu d'obtenir 10 produit sur la liste, je reçois moins que (par exemple 5). La raison étant SetMaxResults (10) me renvoie 10 produits mais avec des doublons. Les doublons sont ensuite supprimés par SetResultTransformer (DistinctRootEntity).

Quelqu'un peut-il me dire n'importe quoi pour obtenir 10 produits uniques sans augmenter SetMaxResults()? J'ai besoin d'utiliser pagenumber comme une sorte d'indexation.

Répondre

0

Ce serait au SQL de décider, en fonction de ce qui se passe dans les méthodes qui obtiennent la liste dont vous avez besoin pour changer le SQL afin qu'il se comporte comme vous le souhaitez.

Mais étant distinct, vous ne devriez pas avoir de doublons.

-1

L'ordre des instructions pourrait-il faire une différence? On dirait que le nombre maximum est fixé tôt et que l'élimination des doublons à la fin, qui s'applique dans cet ordre, pourrait se terminer avec moins que ce que vous avez limité, conformément à ce que vous avez décrit.

Je pense que vous auriez besoin d'obtenir efficacement tous les résultats, puis appliquer la restriction (et éventuellement un sort?) Et éliminer les doublons, puis enfin appliquer votre pagination ou limite de compte à ceux pour obtenir le premier 10, 10 prochains, et ainsi de suite. Donc réorganiser les instructions pour refléter cet ordre logique pourrait aider à corriger votre bug.

+0

Ce serait une solution mais dans le cas d'une grande table, disons 1 million de lignes, cela aurait un impact sur la performance. –

+0

Si vous appliquez SetMaxResults au début ou à la fin n'a pas d'importance. Il traduira toujours dans la même requête SQL lorsqu'il est exécuté. –

0

Il semble que votre problème de doublons provient du fait que vous joignez deux tables et que vous pouvez obtenir le même produit autant de fois que vous en avez le prix.

Que diriez-vous d'ajouter 2 colonnes supplémentaires à votre table de produit:

MinimumPrice (numeric(18,2) 
MaximumPrice (numeric(18,2) 

Chaque fois que votre système modifie les prix pour un produit que vous mettez à jour ces deux champs sur le produit. Maintenant, vous pouvez écrire une requête SQL comme suit:

SELECT TOP 10 * FROM Product 
WHERE MinimumPrice > 2.0 

Et vous n'aurez pas de produits en double.

Questions connexes