2010-02-09 3 views
4

Comment un objet de domaine peut-il inclure une propriété qui calcule une valeur à partir d'autres propriétés mappées afin que la propriété calculée puisse être utilisée par nhibernate dans l'instance d'objet de domaine et le niveau db. linq.NHibernate.Linq - Expression de propriété personnalisée/calculée

Je voudrais être en mesure d'utiliser la propriété lorsque vous travaillez avec l'objet directement:

Console.WriteLine(Entity.Calculated.ToString()); 

Et lorsque vous travaillez avec nhibernate.linq

var q = from e in session.Linq<Entity>() 
       where e.Calculated > 0 
       select e; 
+0

Avez-vous essayé? Si oui, quelles erreurs avez-vous eu et quelle cartographie avez-vous utilisée? Si ce n'est pas le cas, recherchez-vous simplement des références à la documentation? –

+0

Je n'ai pas essayé car je sais que nhibernate va me donner une erreur de propriété non mappée car je ne suis pas en train de mapper Entity.Calculated. Je suis à la recherche de pointeurs et/ou de documentation. – longday

Répondre

3

Vous devez dupliquer la logique dans la classe et la cartographie. Voici un exemple:

Classe:

public class Invoice 
{ 
    public virtual int Id { get; protected set; } 
    public virtual decimal Amount { get; set; } 
    public virtual decimal Paid { get; set; } 
    public virtual decimal Balance 
    { 
     get { return Amount - Paid; } 
    } 
} 

Cartographie:

<class name="Invoice"> 
    <id name="Id"> 
     <generator class="hilo"/> 
    </id> 
    <property name="Amount"/> 
    <property name="Paid"/> 
    <property name="Balance" formula="Amount - Paid" access="readonly"/> 
</class> 

Maintenant, vous pouvez utiliser LINQ et sur requête Invoice.Balance

+0

Parfait! Savez-vous s'il existe un moyen d'utiliser une expression linq pour injecter la formule? Expression > exp = i => i.Amount - i.Paid; – longday

+0

Injecter où? Gardez à l'esprit que "Montant - Payé" dans la formule se réfère aux champs, pas aux propriétés. –

+0

Je voudrais écrire un lambda 1 fois et que la propriété utilise l'expression en appelant return expression.compile(). Invoke (invoice); et aussi nhibernate utiliser l'expression à la place de la formule basée sur la syntaxe sql. De cette façon, je n'écris l'algorithme qu'une seule fois. Je pense que je me suis dirigé vers une nouvelle question. Je posterai un lien vers une nouvelle question une fois que je déterminerai comment le demander. – longday

Questions connexes