2010-02-09 16 views
7

NHibernate ha un attributo sull'elemento proprietà nella configurazione di mappatura denominata "formula" che consente alle iniezioni di sql di "calcolare" una proprietà. Il problema che ho è la formula usando direttamente la sintassi sql. C'è un modo per avere nhibernate.linq per usare un'espressione lambda invece di usare la proprietà formula.NHibernate linq - Utilizzare l'espressione lambda al posto dell'attributo formula sulla mappatura

Ho il seguente:

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 BalanceExpression.Expression.Compile().Invoke(this); } 
    } 
} 

public class BalanceExpression 
{ 
    public static Expression<Func<Invoice, decimal>> Expression 
    { 
     get { return i => i.Amount - i.Paid; } 
    } 
} 

<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> 

voglio NHibernate di utilizzare la balanceexpression.expression invece di dover mettere sintassi SQL nell'attributo formula in modo da poter rimuovere l'attributo formula dal mio mappatura config e scrivere query come segue:

da i in session.linq() dove i.balance> 0 select i;

Come si inserisce l'espressione balanceexpression.expression nella query linq?

risposta

1

Dal momento che avete già la quantità e la proprietà pagato al vostro oggetto, si può solo definire la proprietà Balance come una proprietà regolare:

public int Balance { get { return Amount - Paid; } } 

Se non impostare le proprietà Importo/Paid To 'pigro ', Penso che questa sia la soluzione migliore, più leggibile e più gestibile.
Se una di queste proprietà è caricata a livello pigro, è ancora possibile utilizzare questo metodo, è sufficiente notare che avrebbe effetti collaterali. Per esempio- una dichiarazione come questa

invoices.Where(i => i.Balance > 5) 

causerebbe un accesso DB per ogni fattura della collezione.
Questo potrebbe essere ancora accettabile per voi, basta essere consapevoli di quello ..
Acclamazioni Jhonny

0

Solo un'espressione sql può essere utilizzata come formula, consultare la documentazione - http://www.nhforge.org/doc/nh/en/#mapping-declaration-property. Questo perché entra direttamente nella proprietà Formula di una colonna nel database (una colonna calcolata viene creata con questa formula).
Non rendere le cose troppo complesse, basta usare la formula sql. Se pensi che l'espressione sarà più veloce, ti sbagli.

Problemi correlati