2009-11-09 5 views
0

j'ai fait l'objet POCO mis en correspondance avec la base de données comme ceci:Comparer les objets ICompositeUserType dans NHibernate

class MoneyObject 
{ 
    Money MoneyAmmount { get;set; } 
    string Description { get;set; } 
} 

MoneyAmmount - est le type d'argent qui est dérivé de ICompositeUserType et dispose de 2 propriétés décimales Montant et chaîne CurrencyCode:

class Money 
{ 
    decimal Ammount { get;set; } 
    string CurrencyCode { get;set; } 
} 

problème apparaît quand je suis en train de chercher l'aide de critères, comme les données de base de données suivantes:

var criteria = session.CreateCriteria(typeof(MoneyObject)) 
       .Add(Expression.Lt("MoneyAmmount", money)); 

Il génère suivant la requête SQL:

SELECT this_.Id as Id2_0_, this_.Value as Value2_0_, this_.Currency as Currency2_0_, this_.Description as Descript4_2_0_ 
FROM MoneyObject this_ 
WHERE this_.Value < @p0 and this_.Currency < @p1;@p0 = 300,01, @p1 = 'USD' 

Je ne veux pas comparer mon objet valuetype argent en utilisant CurrecyCode par caractère. Je souhaite comparer Money uniquement en fonction de la propriété amount et extraire des données à l'aide de critères. Mais traitant des critères uniquement avec les propriétés de l'objet POCO. Signifie que je sais qui fonctionne comparision:

Expression.Lt("MoneyAmmount.Ammount", money.Ammount) 

Je veux éviter la comparaison par les propriétés de l'objet valuetype et de réaliser la comparaison uniquement entre les objets valuetype comme

Expression.Lt("MoneyAmmount", money) 

Quelqu'un sait-il comment changer ce comportement comparer?

Répondre

2

Essayez quelque chose comme ça

var criteria = session.CreateCriteria(typeof(MoneyObject), "m") 
          .CreateAlias("m.MoneyAmmount", "a") 
          .Add(Expression.Lt("a.Ammount", money)); 

Création des alias « m » et « un » vous permet de comparer à la propriété nichée.

+0

Oui je sais à ce sujet, mais je veux comparer des objets d'argent en valeur ammount et non une propriété ammount décimale. J'ai besoin de comparer des objets de type valuetype par propriétés numériques ou par une logique personnalisée car je fais face à une grande quantité de types composites différents. – Regfor

+1

Désolé, la question indique que vous souhaitez comparer l'argent par la propriété montant. Pourriez-vous nous dire quelle est la variable «argent»? Désolé si je ne comprends pas. –

+0

À moins que je manque quelque chose de vraiment évident, votre première expression de critères est correct, le SQL généré va toujours comparer sur les deux propriétés de votre objet POCO, la base de données contient uniquement les données, il faut comparer à la fois si vous ne voulez faire correspondre les objets Money dans la propriété MoneyAmmount. Désolé si cela ne vous aide pas. –

Questions connexes