2009-10-22 5 views
5

मैं साइटकोर में किसी दिए गए आइटम में सभी फ़ील्ड प्राप्त करने के लिए एक SQL क्वेरी लिखने की कोशिश कर रहा हूं।क्या मुझे किसी आइटम (साइटकोर में) में सभी फ़ील्ड मिल सकते हैं?

कहने के लिए कि मैं फंस गया हूं इसे हल्के ढंग से डाल रहा है।

मुझे लगता है कि मुझे फील्ड टेबल पर कुछ स्वयं शामिल होना है, लेकिन मैं खुद को समुद्री मील में प्राप्त कर रहा हूं।

किसी के पास कोई विचार है?

उत्तर

10

मामलों क्या तुमने कभी Sitecore डेटाबेस खुद क्वेरी करने के लिए प्रयास करना चाहिए में से कोई भी में वापस नहीं करता है। समय के साथ डेटाबेस बदलता है और यह आपके कोड को तोड़ देगा। इसके बजाय, Item.Fields का उपयोग करें। यह एक संग्रह है जिसमें सभी आवश्यक फ़ील्ड शामिल हैं। यदि आप यह सुनिश्चित करना चाहते हैं कि सभी फ़ील्ड लोड हो जाएं (वास्तव में लोड हो, आलसी लोड न हों), तो आप आइटम का उपयोग कर सकते हैं। Fields.ReadAll()।

संपादित करें: यह भी ध्यान रखें कि क्वेरीिंग आपको एक आइटम बनाने की अनुमति नहीं देती है, इसलिए आप डिफ़ॉल्ट मानों के व्यवहार को याद करते हैं और बुद्धिमान साइटकोर कैशिंग का उपयोग नहीं करते हैं।

+0

मैं आलसी लोडिंग करना चाहता हूं। क्या आप कृपया मुझे बता सकते हैं कि इसे कैसे हल करें ?? –

6

फ़ील्ड देखने से पहले Sitecore.Context.Item.Fields.ReadAll() पर कॉल करने का प्रयास करें।

+0

जब मैं ऐसा करता हूं तो यह सभी फील्ड नाम सिस्टम फ़ील्ड होते हैं। मैं उम्मीद कर रहा था कि उपयोगकर्ता परिभाषित टेम्पलेट फ़ील्ड नाम प्राप्त करने का एक तरीका है। – BraveNewMath

2

पहले प्रयास, लेकिन सभी क्षेत्रों

SELECT I2.Name FROM 
Items AS I 
JOIN UnversionedFields AS UF ON I.ID = UF.ItemId 
JOIN VersionedFields AS V ON I.ID = V.ItemId 
JOIN SharedFields AS S ON I.ID = S.ItemId 
JOIN Items AS I2 ON I2.ID = UF.FieldId OR I2.ID=V.FieldId OR I2.ID = S.FieldId  
WHERE I.ID = '110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9' 
GROUP BY I2.Name 
+0

यह ठीक काम करता प्रतीत होता है, लेकिन मुझे अभी भी सटीक मूल्य नहीं मिला जो मैं ढूंढ रहा था। आइटम से चुनें मूल्य मैं के साथ (NOLOCK) भीतरी I.TemplateID = T.ID पर आइटम टी में शामिल होने भीतरी F.ItemId पर फील्ड्स एफ में शामिल होने = I.ID भीतरी F.FieldId = एफ एन पर एफ एन आइटम में शामिल होने के .ID जहां I.templateID = '{xxxxxxx}' और FN.Name = 'विवरण' – Netferret

1

आइटम को कॉल करके। फ़ील्ड आपको आइटम टेम्पलेट्स मिलते हैं जिन्हें आपने अपने टेम्पलेट्स में निर्दिष्ट किया है साथ ही साथ साइटकोर मानक फ़ील्ड्स जो सभी वस्तुओं पर मौजूद हैं। नीचे दिए गए कोड का प्रयोग करें यदि आप केवल उन फ़ील्ड को चाहते हैं जिन्हें आपने अपने टेम्पलेट्स में परिभाषित किया है। बेशक, यह मानता है कि आपके क्षेत्र के नाम "__"

// Get Fields directly from the Item 
List<string> fieldNames = new List<string>(); 
item.Fields.ReadAll(); 
FieldCollection fieldCollection = item.Fields; 
foreach (Field field in fieldCollection) 
{ 
    //Use the following check if you do not want 
    //the Sitecore Standard Fields 
    if (!field.Name.StartsWith("__")) 
    { 
     fieldNames.Add(field.Name); 
    } 
} 
+0

मैं खुद को इस समस्या को देख रहा हूं और मूल रूप से एक ही समाधान का उपयोग कर रहा हूं, लेकिन मैंने लिंक को "0__" के लिए चेक को धक्का दिया है जैसे कि foreach (फील्ड क्षेत्र में फ़ील्ड क्षेत्र। X => ! x.Name.StartsWith ("__")) आपको क्या लगता है? बेहतर, बदतर, तेज निष्पादन? –

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