2010-02-09 5 views
7

NHibernate "सूत्र" का नाम दिया मानचित्रण config कि एसक्यूएल इंजेक्शन के एक संपत्ति "गणना" करने की अनुमति देता में संपत्ति तत्व पर एक विशेषता है। मेरे पास समस्या एसक्यूएल सिंटैक्स का उपयोग कर सूत्र है। फार्मूला संपत्ति का उपयोग करने के बजाय lambda अभिव्यक्ति का उपयोग करने के लिए nhibernate.linq रखने का कोई तरीका है।NHibernate LINQ - मानचित्रण पर सूत्र विशेषता के स्थान पर उपयोग लैम्ब्डा अभिव्यक्ति

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> 

मैं बजाय सूत्र विशेषता में एसक्यूएल वाक्य रचना डाल करने के लिए इसलिए मैं अपने मानचित्रण config से सूत्र विशेषता को हटाने और प्रश्नों लिख सकते हैं होने के balanceexpression.expression उपयोग करने के लिए nhibernate हैं:

मैं निम्नलिखित है निम्नानुसार:

सत्र से .linq() जहां i.balance> 0 I का चयन करें;

मैं LINQ क्वेरी में balanceexpression.expression कैसे इंजेक्षन करते हैं? http://www.nhforge.org/doc/nh/en/#mapping-declaration-property -

उत्तर

1

के बाद से आप पहले से ही राशि और आपकी वस्तु पर भुगतान किया गुण होते हैं, तो आप सिर्फ बैलेंस संपत्ति एक नियमित रूप से संपत्ति के रूप में परिभाषित कर सकते हैं ', मुझे लगता है कि यह सबसे अच्छा, सबसे पठनीय और सबसे रखरखाव समाधान है।
इन गुणों का या तो आलसी-भरी हुई है, तो आप अभी भी इस विधि का उपयोग कर सकते हैं, बस ध्यान दें कि यह दुष्प्रभाव हो जाएगा। इस

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

के रूप में एक बयान उदाहरण के लिए संग्रह में प्रत्येक चालान के लिए एक डीबी पहुंच का कारण होगा।
यह अभी भी आप के लिए स्वीकार्य हो सकता है, सिर्फ इतना है कि बारे में पता होना ..
चीयर्स Jhonny

0

केवल एक एसक्यूएल अभिव्यक्ति प्रलेखन जाँच, एक सूत्र के रूप में इस्तेमाल किया जा सकता। ऐसा इसलिए है क्योंकि यह सीधे डेटाबेस में कॉलम की फॉर्मूला प्रॉपर्टी में जाता है (इस सूत्र के साथ एक गणना कॉलम बनाया गया है)।
बातें बहुत जटिल मत करो, बस उस एसक्यूएल सूत्र का उपयोग करें। अगर आपको लगता है कि अभिव्यक्ति तेज होगी - आप गलत हैं।

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

आप राशि/अदा गुण लेज़ी करने के लिए 'निर्धारित नहीं करते हैं:

संबंधित मुद्दे