.NET 3.5, सी #क्या LINQ से SQL एक XML फ़ील्ड डीबी-सर्वरसाइड क्वेरी कर सकता है?
मेरे पास "खोज" सुविधा वाला एक वेब ऐप है। खोजे जाने वाले कुछ फ़ील्ड तालिका में प्रथम श्रेणी के कॉलम हैं, लेकिन उनमें से कुछ वास्तव में एक्सएमएल डेटा प्रकार के अंदर घोंसला वाले फ़ील्ड हैं।
पहले, मैंने अपनी खोज के लिए गतिशील रूप से एसक्यूएल बनाने के लिए एक प्रणाली बनाई थी। मेरे पास एक अच्छी कक्षा पदानुक्रम था जिसने एसक्यूएल अभिव्यक्तियों और सशर्त बयान बनाए। एकमात्र समस्या यह थी कि यह एसक्यूएल इंजेक्शन हमलों से सुरक्षित नहीं था।
मैं रोब कॉनरी के उत्कृष्ट आलेख (http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/) पढ़ रहा था, जिसने इंगित किया कि एकाधिक क्वेरी सर्वर के लिए एक एकल TSQL क्वेरी में संयुक्त हो सकती हैं यदि IQueryable परिणाम कभी समझा नहीं जाता है। यह मुझे यह सोचने के लिए मिला कि मेरा गतिशील खोज निर्माण बहुत जटिल था - मुझे बस कई LINQ अभिव्यक्तियों को गठबंधन करने की आवश्यकता थी।
उदाहरण (काल्पनिक) के लिए:
लेखक: आईडी (पूर्णांक), अंतिम नाम (varchar (32)), FirstName (varchar (32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
निम्नलिखित में परिणाम क्वेरी:
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
मुझे एहसास हुआ कि यह है कि SQL से सुरक्षित है एक सरल गतिशील क्वेरी पीढ़ी के लिए एकदम सही समाधान हो सकता है इंजेक्शन - मैं अपने IQueryable परिणाम पर बस लूप करता हूं और अपनी अंतिम एकल-निष्पादन अभिव्यक्ति प्राप्त करने के लिए अतिरिक्त सशर्त अभिव्यक्ति निष्पादित करता हूं।
हालांकि, मुझे XML डेटा के मूल्यांकन के लिए कोई समर्थन नहीं मिल रहा है। TSQL में, प्राप्त करने के लिए एक XML नोड से एक मूल्य है, हम जैसे
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
कुछ करना होगा लेकिन मैं इस मूल्यांकन बनाने के बराबर LINQ एसक्यूएल को नहीं मिल रहा। क्या कोई अस्तित्व में है? मुझे पता है कि मैं सभी गैर-एक्सएमएल स्थितियों डीबी पक्ष का मूल्यांकन कर सकता हूं, और फिर मेरा एक्सएमएल मूल्यांकन कोड पक्ष कर सकता हूं, लेकिन मेरा डेटा इतना बड़ा है कि ए) प्रदर्शन पर खींचने के लिए बहुत सारे नेटवर्क यातायात हैं और बी) मैं बाहर निकल जाऊंगा- मेमोरी अपवाद अगर मैं एक्सएमएल पहले डीबी पक्ष का मूल्यांकन कुछ परिणाम सेट को बाहर करने के लिए नहीं कर सकता।
विचार? सुझाव?
बोनस प्रश्न - यदि एक्सएमएल मूल्यांकन वास्तव में संभव है डीबी पक्ष, FLWOR समर्थन के बारे में क्या?
तो, मैं प्रत्येक के लिए देखो यह 2013 के अंत है - अपडेट? –
@ बेंजामिनग्रेनबाम यह लंबे समय से रहा है क्योंकि मैंने इस सवाल के बारे में सोचा है। जब मैंने तब और अब के बीच नौकरियां बदल दीं तो इसके लिए मेरा उपयोग केस गायब हो गया। जितना अच्छा मैं याद कर सकता हूं, मैंने नीचे दी गई डैनियलएम दृष्टिकोण का उपयोग किया, जो उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन को कॉल करना था। ऐसा नहीं कह सकता क्योंकि मैंने तब से LINQ में कोई प्रत्यक्ष समर्थन देखा है (लेकिन मैं या तो नहीं देख रहा हूं) – Matt
दिलचस्प - मैं 5 साल बाद एक बक्षीस के साथ नए उत्तरों को मछली पकड़ने की कोशिश करूंगा। –