2010-02-09 19 views
7

NHibernate ma atrybut na elemencie właściwości w konfiguracji odwzorowania o nazwie "formuła", która pozwala iniekcji sql "obliczyć" właściwość. Problem, który mam, to formuła bezpośrednio używająca składni sql. Czy istnieje sposób, aby nhibernate.linq używał wyrażenia lambda zamiast używać właściwości formuły.NHibernate linq - Użyj wyrażenia lambda zamiast atrybutu formuły na mapowaniu

mam następujące:

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> 

Chcę NHibernate używać balanceexpression.expression zamiast umieścić składni SQL w atrybucie wzorze więc mogę usunąć atrybut wzór z mojego mapowania config i pisać zapytania w następujący sposób:

od i w session.linq() gdzie i.balance> 0 wybierz i;

Jak wstawić wyrażenie balanceexpression.express do zapytania linq?

Odpowiedz

1

Skoro masz już ilość i płatne na swojej właściwości obiektu, można po prostu określić właściwość balansu jako zwykły nieruchomości:

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

Jeśli nie ustawić ilość/zapłacone właściwości do „Lazy ", Uważam, że jest to najlepsze, najbardziej czytelne i możliwe do utrzymania rozwiązanie.
Jeśli którakolwiek z tych właściwości jest LENY-obciążona, nadal można korzystać z tej metody, wystarczy pamiętać, że miałaby ona skutki uboczne. Na przykład- oświadczenie takie jak ten

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

spowodowałoby dostępu DB dla każdej faktury w kolekcji.
To może być jeszcze do zaakceptowania dla Ciebie, po prostu mieć świadomość, że ..
Cheers JHONNY

0

Tylko wyrażenie sql może być używane jako formuła, sprawdź dokumentację - http://www.nhforge.org/doc/nh/en/#mapping-declaration-property. Dzieje się tak dlatego, że bezpośrednio przechodzi do właściwości Formula kolumny w bazie danych (kolumna obliczeniowa jest tworzona za pomocą tej formuły).
Nie rób rzeczy zbyt skomplikowanych, po prostu użyj tej formuły sql. Jeśli uważasz, że ekspresja będzie szybsza - jesteś w błędzie.