2011-05-26 9 views
28

एक नया और इसकी उपयोगिता पुस्तकालय nHibernate के उपयोगकर्ता, धाराप्रवाह NHibernate के रूप में, मैं एक अच्छा डाटाबेस के साथ खतरनाक हो करने के लिए पर्याप्त जानने की कोशिश कर रहा हूँ।क्या कोई बेहतर व्याख्या कर सकता है कि 'अनुमान' nHibernate में क्या हैं?

मुझे अनुमानों की अवधारणा को समझने में कठिनाई का असाधारण सौदा है। विशेष रूप से, वे दुनिया में क्या हैं?

मैंने सचमुच 'पर सटीक खोज की है अनुमान क्या हैं? 'और' एनएचबर्ननेट 'और' एनएचबर्ननेट, अनुमान, परिभाषा 'आदि में परियोजनाएं, और मैं अभी भी बहुत उलझन में हूं। सबसे उपयोगी पोस्ट अब तक This other StackOverflow Question और This Blog Post by Colin Ramsay हैं। लेकिन मैं अभी भी काफी उलझन में हूँ। डेटाबेस का मेरा ज्ञान अभी भी प्रवेश स्तर है।

मुझे वास्तव में समझ में नहीं आता कि कौन से अनुमान हैं, मैं उनका उपयोग क्यों करना चाहता हूं, वे क्या हासिल कर रहे हैं, आदि। मैं ब्लॉग पोस्ट में देखता हूं कि वह उन्हें पूर्णांक की सूची प्राप्त करने के लिए उपयोग कर रहा है (मुझे प्राथमिक कुंजी मानती है) ताकि वह उन्हें एक अलग प्रश्न में उपयोग कर सके, लेकिन यह काम करने के तरीके में क्यों घबराहट है और क्यों।

उत्तर

67

यहां एक व्यावहारिक उदाहरण है।

मान लें कि आपके पास ऑनलाइन स्टोर है और आपके डोमेन वर्गों में से एक Brand "सैमसंग" जैसा है। इस वर्ग में इसके साथ जुड़े गुणों का एक बोतलबंद है, शायद एक पूर्णांक Identity, एक Name, एक मुक्त पाठ Description फ़ील्ड, Vendor ऑब्जेक्ट का संदर्भ, और इसी तरह।

अब मान लें कि आप अपने ऑनलाइन स्टोर पर पेश किए गए सभी ब्रांडों की एक सूची के साथ मेनू प्रदर्शित करना चाहते हैं। तुम सिर्फ session.CreateCriteria<Brand>().List() करते हैं, तो आप वास्तव में ब्रांडों के सभी प्राप्त करने के लिए जा रहे हैं। लेकिन क्या आप भी डेटाबेस से Vendor रों करने के लिए लंबी Description क्षेत्रों और संदर्भ के सभी चूसा होगा, और आप एक मेनू प्रदर्शित करने के लिए कि जरूरत नहीं है, तुम सिर्फ Name और Identity की जरूरत है। निष्पादन के अनुसार, डेटाबेस से नीचे इस अतिरिक्त डेटा को चूसने से चीजें धीमा हो जाती हैं और अनावश्यक होती है।

बजाय, आप एक "प्रक्षेपण" उद्देश्य यह है कि सिर्फ Identity और Name शामिल यह बुला, कहते हैं, NameIdentityPair बना सकते हैं:

public class NameIdentityPair 
{ 
    public int Identity { get; set; } 
    public string Name { get; set; } 
} 

और आप NHibernate बता केवल डेटा है कि तुम सच की जरूरत को चुनने के लिए कर सकता है यह कह रही है अपने प्रक्षेपण पर परिणाम सेट को बदलने के लिए द्वारा हाथ में कार्य करने के लिए:

var brandProjections = this.session.CreateCriteria<Brand>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("Name"), "Name") 
     .Add(Projections.Property("Identity"), "Identity")) 
    .SetResultTransformer(Transformers.AliasToBean<NameIdentityPair>()) 
    .List<NameIdentityPair>(); 

foreach (var brandProjection in brandProjections) 
{ 
    Console.WriteLine(
     "Identity: {0}, Name: {1}", 
     brandProjection.Identity, 
     brandProjection.Name); 
} 

अब आप Brand रों की एक सूची, लेकिन इसके बजायकी एक सूची नहीं हैएस, और एनएचबर्ननेट ने इस प्रक्षेपण को प्राप्त करने के लिए केवल SELECT b.Identity, b.Name from dbo.Brand b जैसे एसक्यूएल स्टेटमेंट जारी किए हैं, जो बड़े पैमाने पर SQL कथन के विपरीत है जो Brand ऑब्जेक्ट (उदा। SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v ....) को हाइड्रेट करने के लिए आवश्यक सबकुछ पकड़ता है।

उम्मीद है कि इससे मदद मिलती है।

+2

तो अनुमान क्वेरी-साइड सीमाओं की तरह हैं, क्वेरी-परिणाम सीमाओं का पूर्णांक। एक सामान्य परिदृश्य में, मैं 'NameIdentityPair' ऑब्जेक्ट बनाउंगा और क्वेरी से इसके परिणाम को मैप कर दूंगा, लेकिन प्रक्षेपण का उपयोग करके, मैं इसके बजाय सटीक फ़िल्टरिंग निर्दिष्ट करता हूं जो मैं क्वेरी में सही मांगता हूं, और यह सब डेटाबेस है? – Derek

+4

कई एप्लिकेशन लिखने से अधिक बार पढ़ते हैं, इसलिए डेटाबेस से पढ़ने के दौरान अनुमानों का उपयोग करना और डेटाबेस में सहेजने के लिए पूरी तरह से हाइड्रेटेड डोमेन ऑब्जेक्ट्स का उपयोग करना एक आम पैटर्न है। इस तरह, डेटाबेस से पढ़ना प्रदर्शन के लिए ट्यून किया गया है, और डेटाबेस को लिखना व्यापार तर्क (आपके डोमेन कक्षाओं में लिखे गए) और आपके द्वारा उपयोग किए जाने वाले टूल का लाभ लेने के लिए ट्यून किया गया है (एनएचबीर्नेट आपको सीआरयूडी कोड से अधिक बचत करता है)। "प्रक्षेपण" इस बात की तरह है कि आपको किस डेटा की आवश्यकता होगी ताकि NHBernate केवल उस डेटा के लिए डेटाबेस से पूछता है जब यह SQL बनाता है। –

+0

धन्यवाद, मुझे लगता है कि अब तक जो कुछ मिला है उससे कहीं ज्यादा स्पष्ट है। – Derek

1

आप एसयूएम, COUNT ... जैसे एसक्यूएल कार्यों को कॉल करने के लिए अनुमानों का उपयोग कर सकते हैं या एक इकाई को वापस किए बिना एकल फ़ील्ड का चयन कर सकते हैं।

"... एक रिपोर्ट क्वेरी प्राप्त कर रहा है एक इकाई या इकाइयों का ही गुण, लोडिंग इकाई अपने आप में एक लेन-देन संबंधी दायरे में की भूमि के ऊपर के बिना यह है कभी कभी कहा जाता है;। इसे और अधिक सही ढंग से प्रक्षेपण कहा जाता है।" [एनएचबीर्नेट एक्शन]

2

यदि आप एसक्यूएल से परिचित हैं, तो एक प्रक्षेपण SELECT एक प्रश्न का खंड है, जो उपलब्ध परिणामों से कौन से फ़ील्ड वापस लौटने के लिए उपयोग किया जाता है।

उदाहरण के लिए, मान लें कि आपके एक साथ PersonFirstName, LastName, Address, और Phone क्षेत्रों की है। आप किसी क्वेरी सब कुछ वापस करना चाहते हैं, तो आप प्रक्षेपण, जो एसक्यूएल में SELECT * FROM Person की तरह है बंद छोड़ सकते हैं। यदि आप केवल पहले और अंतिम नाम चाहते हैं, तो आप FirstName और LastName के साथ एक प्रोजेक्शन तैयार करेंगे - जो SQL शर्तों में SELECT FirstName, LastName FROM Person होगा।

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