2012-10-25 15 views
9

मैं Linq to Sql पर एक लेख पढ़ रहा था और इस में आए:क्या एसक्यूएल स्ट्रिंग्स पर IQueryable <T> लैम्ब्डा एक्सप्रेशन का अनुवाद करने के लिए कोई एपीआई या एक्सटेंशन है?

IQueryProvider provider = new QueryProvider(database.GetCommand, database.ExecuteQuery); 
IQueryable<Product> source = new Queryable<Product>(provider, database.GetTable<Product>()); 
IQueryable<string> results = source.Where(product => product.CategoryID == 2) 
            .OrderBy(product => product.ProductName) 
            .Select(product => product.ProductName) 
            .Skip(5) 
            .Take(10); 

लेखक तो सादे एसक्यूएल में परिणाम अनुवाद:

exec sp_executesql N'SELECT [t1].[ProductName] 
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductName]) AS [ROW_NUMBER], [t0].[ProductName] 
FROM [dbo].[Products] AS [t0] 
WHERE [t0].[CategoryID] > @p0 
) AS [t1] 
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2 
ORDER BY [t1].[ROW_NUMBER]',N'@p0 int,@p1 int,@p2 int',@p0=2,@p1=5,@p2=10 

और मैं अपने आप को पवित्र गाय सोचा, "wouldn ' यह बहुत अच्छा होगा अगर IQueryable के लिए कोई एक्सटेंशन था जो डीबगिंग करते समय आपके लिए इन तारों को उत्पन्न करेगा? "

किसी ने कभी इस तरह के बारे में सुना है, और यदि ऐसा है, तो क्या आप मुझे सही दिशा में इंगित कर सकते हैं?

धन्यवाद!

+2

http://msdn.microsoft.com/en-us/library/bb386961.aspx – Servy

+0

सामान्य रूप से यह करने के लिए पृष्ठभूमि के लिए, http://msdn.microsoft.com/en-us देखें /library/bb399342.aspx – AakashM

उत्तर

4

लिंक से एसक्यूएल के साथ आप query.Provider.ToString() पर कॉल कर सकते हैं और यह आपको क्वेरी का टेक्स्ट लौटाएगा (बीटीडब्ल्यू आप डीबगिंग के दौरान विजुअल स्टूडियो में एक ही संपत्ति देख सकते हैं)।

अद्यतन: (जटिल भाग) इसे कैसे कार्यान्वित किया जाता है?

वास्तविक स्ट्रिंग पीढ़ी System.Data.Linq.SqlClient.SqlProvider कक्षा द्वारा की जाती है। इसमें छिपी हुई विधि string IProvider.GetQueryText(Expression query) है, जो पारित अभिव्यक्ति के आधार पर SQL क्वेरी टेक्स्ट बनाता है। यह विधि आंतरिक इंटरफ़ेस IProvider द्वारा छिपी हुई है, इसलिए इसे कॉल करने के लिए यह छोटी बात नहीं है।

+0

यह बहुत आसान लगता है: पी – Rawling

+0

@ राउलिंग क्षमा करें, हम इसे बाद में जटिल कर सकते हैं :) –

2

मुझे लगता है कि Linqpad का उपयोग एसक्यूएल और लिंक के बीच अनुवाद करने के लिए किया जा सकता है, उम्मीद है कि मदद करता है।

+0

आप linqpad के साथ ऐसा कैसे करेंगे? –

2

आप को DataContext.Log संपत्ति सेट कर सकते हैं एक TextWriter (जैसे Console.Out) एसक्यूएल के रूप में यह उत्पन्न होता है देखने के लिए है, लेकिन मैं यह आप उत्पादन एसक्यूएल की सुविधा देता है नहीं लगता कि यह को क्रियान्वित करने के बिना।

+3

आप इसे 'स्ट्रिंगवाइटर' पर भी सेट कर सकते हैं जो 'स्ट्रिंगबिल्डर' को लिखता है, या इसे सीधे फ़ाइल में लिखने के लिए सेट करता है। कंसोल के लिए वे आम विकल्प हैं। – Servy

+0

@ सर्वी: +1 'स्ट्रिंगवाइटर' वह है जो शायद ही कभी इस्तेमाल किए जाने वाले प्रकार हैं जो आमतौर पर कई उद्देश्यों के लिए आदर्श होते हैं। – leppie

1

एक भयानक hacky समाधान:

उपयोग DataContext.Log जैसा कि पहले कहा, लेकिन सिर्फ एक सौदे और रोलबैक में सब कुछ लपेटो। ; पी