यहां एक व्यावहारिक उदाहरण है।
मान लें कि आपके पास ऑनलाइन स्टोर है और आपके डोमेन वर्गों में से एक 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 ....
) को हाइड्रेट करने के लिए आवश्यक सबकुछ पकड़ता है।
उम्मीद है कि इससे मदद मिलती है।
तो अनुमान क्वेरी-साइड सीमाओं की तरह हैं, क्वेरी-परिणाम सीमाओं का पूर्णांक। एक सामान्य परिदृश्य में, मैं 'NameIdentityPair' ऑब्जेक्ट बनाउंगा और क्वेरी से इसके परिणाम को मैप कर दूंगा, लेकिन प्रक्षेपण का उपयोग करके, मैं इसके बजाय सटीक फ़िल्टरिंग निर्दिष्ट करता हूं जो मैं क्वेरी में सही मांगता हूं, और यह सब डेटाबेस है? – Derek
कई एप्लिकेशन लिखने से अधिक बार पढ़ते हैं, इसलिए डेटाबेस से पढ़ने के दौरान अनुमानों का उपयोग करना और डेटाबेस में सहेजने के लिए पूरी तरह से हाइड्रेटेड डोमेन ऑब्जेक्ट्स का उपयोग करना एक आम पैटर्न है। इस तरह, डेटाबेस से पढ़ना प्रदर्शन के लिए ट्यून किया गया है, और डेटाबेस को लिखना व्यापार तर्क (आपके डोमेन कक्षाओं में लिखे गए) और आपके द्वारा उपयोग किए जाने वाले टूल का लाभ लेने के लिए ट्यून किया गया है (एनएचबीर्नेट आपको सीआरयूडी कोड से अधिक बचत करता है)। "प्रक्षेपण" इस बात की तरह है कि आपको किस डेटा की आवश्यकता होगी ताकि NHBernate केवल उस डेटा के लिए डेटाबेस से पूछता है जब यह SQL बनाता है। –
धन्यवाद, मुझे लगता है कि अब तक जो कुछ मिला है उससे कहीं ज्यादा स्पष्ट है। – Derek