2010-10-13 5 views
20

मैं इस बात को समझने की कोशिश कर रहा हूं किएसक्यूएल में शामिल होने की तरह मैं ओडाटा एक्सपैंड का उपयोग कैसे करूं?

select * 
from Users u 
inner join Comments c on c.UserId = u.Id 
where Id = 1569 

(बेहतर एसक्यूएल पठनीयता के लिए तालिका उपनाम)

... स्टैक ओवरव्लो ओडाटा एंडपॉइंट पर। यह यूआरएल कैसे बनाया जाएगा? मैं OData.org पर Expand के लिए प्रलेखन देख रहा हूं और मैंने सोचा होगा कि यह कुछ ऐसा दिखाई देगा:

https://odata.sqlazurelabs.com/OData.svc/v0.1/rp1uiewita/StackOverflow/Users?$Expand=Comments&$filter=UserId eq 1569 लेकिन सही नहीं है।

लिंक में, यह होगा (मुझे लगता है), लेकिन जॉइन समर्थित नहीं है:

Users.Where(u=>u.Id==1569).Join(Comments, u=>u.Id, c=>c.UserId, (a,b)=>a.Id==b.UserId)

मुझे इसे कंक में कड़ाई से समझने की आवश्यकता नहीं है, मैं बस कोशिश कर रहा हूं क्वेरी यूआरएल बनाने के तरीके को समझने के लिए। असल में, मैं एसक्यूएल को ओडीटा यूआरएल में पूर्वानुमानित करने का अनुवाद कैसे कर सकता हूं और इसे एक कॉल में कर सकता हूं?

+9

ऐसा लगता है कि यह स्टैक ओवरफ्लो का 1 मिलियनवां सवाल है, बधाई हो! – jwaddell

+2

ठीक है, अगर आप उन प्रश्नों की गिनती करते हैं जिन्हें इस प्रश्न से पूछे जाने तक हटाया नहीं गया था। – jjnguy

+0

@jwaddell मैंने वास्तविक मिलियन प्रश्न के बाद एक मिलीसेकंड प्रस्तुत किया, इसलिए मुझे लगता है कि यह 1e6 + 1 –

उत्तर

15

की तरह यह कुछ होगा करने के लिए सही रास्ता:

http://odata.stackexchange.com/stackoverflow/atom/Users(1569)?$expand=Comments 

समस्या है वहाँ डेटा स्रोत का कोई भी उपयोगकर्ता होने लगते हैं कि (पता नहीं क्यों) है, इसलिए ऊपर क्वेरी वापस आ जाएगी एक 404. लेकिन यह सही वाक्यविन्यास है।

विचार यह है कि यदि आप केवल एक उपयोगकर्ता के बारे में जानकारी चाहते हैं तो /Users(1569) (पैरेथेसिस में सामान इकाई सेट की प्राथमिक कुंजी है) का उपयोग करके आप इसे "नेविगेट" करते हैं। फिर यदि आप सभी टिप्पणियां भी शामिल करना चाहते हैं, तो आप बस $expand=Comments जोड़ें। यदि आप केवल टिप्पणियां चाहते हैं और उपयोगकर्ता के बारे में जानकारी नहीं चाहते हैं तो आप /Users(1569)/Comments कर सकते हैं।

ध्यान दें कि आपके द्वारा उपयोग की जाने वाली सेवा नेविगेशन गुणों को परिभाषित नहीं किया गया है, इसलिए उपरोक्त काम नहीं करेगा क्योंकि "जॉइन" वास्तव में समर्थित नहीं हैं। लेकिन stackexchange odata endpoint में नेविगेशन गुण परिभाषित हैं।

असल में जॉइन सर्वर/सेवा पर परिभाषित किए गए हैं ताकि क्लाइंट को यह पता न हो कि कौन सा कॉलम प्राथमिक कुंजी है।

यह डेटा स्रोतों के साथ भी मदद करता है जो रिलेशनल डेटाबेस का उपयोग अपने भंडारण के रूप में नहीं करते हैं, क्योंकि इससे उन्हें नकली विदेशी कुंजी बनाने के लिए मजबूर नहीं किया जाता है।

आप ग्राफ के आगे "परतें" का विस्तार कर सकते हैं। यदि विस्तार में लौटाई गई इकाई भी आगे नेविगेशन गुणों को परिभाषित करती है, तो आप नेविगेशन गुणों की अल्पविराम से अलग सूची निर्दिष्ट कर सकते हैं।

यहां एक मेकअप सेवा के लिए एक उदाहरण दिया गया है, ध्यान दें कि यह संग्रह में प्रत्येक ग्राहक का विस्तार कर रहा है, जो एकाधिक शामिल होने के समान है।

.../Customers?$expand=Orders,OrderDetails 
+0

यह यूआरएल सिंटैक्स उपयोगकर्ता.आईडी और टिप्पणियों के बीच रिश्ते को कैसे व्यक्त करता है। यूज़र आईडी? उन क्षेत्रों को एक-दूसरे के बारे में कैसे पता चलता है? क्या यह रिश्ते सर्वर की तरफ पहचाना जाता है? –

+2

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

+0

मैं आपके अतिरिक्त नोट से चिंतित हूं, सफलता या विफलता यह क्वेरी OData के कार्यान्वयन पर भरोसा करती है? क्या यह क्वेरी spec द्वारा गारंटी नहीं है? –

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