2008-11-11 10 views
6

हमारे पास "ग्राहक के लिए कार्यों की संख्या" या "ग्राहक के लिए कुल चालान राशि" जैसी चीज़ों को वापस करने के लिए हमारे डेटाबेस में स्केलर फ़ंक्शन हैं।क्या LINQ से SQL के साथ स्केलर फ़ंक्शंस का उपयोग/एक्सेस करना संभव है?

हम प्रयोग कर रहे हैं और इस डब्ल्यू/ओ संग्रहीत प्रक्रियाओं को करने की कोशिश कर रहे हैं ... आम तौर पर हम इस फ़ंक्शन को हमारी संग्रहीत प्रक्रिया में कॉल करेंगे और इसे एक मान के रूप में वापस कर देंगे।

क्या LINQ से SQL के साथ स्केलर फ़ंक्शंस का उपयोग या एक्सेस करने का कोई तरीका है? यदि ऐसा है, तो मुझे एक उदाहरण देखने में दिलचस्पी होगी कि कैसे ... यदि नहीं, तो इस तरह की स्थिति को संभालने के लिए सबसे अच्छा कैसे होगा ... यदि यह भी करने योग्य है।

उत्तर

9

LINQ-to-SQL यूडीएफ के साथ उपयोग का समर्थन करता है, यदि आपका यही मतलब है। बस यूडीएफ को डिजाइनर सतह पर खींचें और आप कर चुके हैं। यह डेटा-संदर्भ पर एक मिलान विधि बनाता है, चिह्नित [Function(..., IsComposable=true)] या इसी तरह, LINQ-to-SQL को बताता है कि यह क्वेरी में इसका उपयोग कर सकता है (ध्यान दें कि ईएफ इस उपयोग का समर्थन नहीं करता है)।

var qry = from cust in ctx.Custs 
      select new {Id = cust.Id, Value = ctx.GetTotalValue(cust.Id)}; 

जो की तरह TSQL कुछ हो जाएगा:

SELECT t1.Id, dbo.MyUdf(t1.Id) 
FROM CUSTOMER t1 

(या वहाँ-abouts)

फिर आप की तरह अपने प्रश्न में यह प्रयोग करेंगे।

तथ्य यह है कि यह संगत है इसका मतलब है कि आप प्रश्नों में मूल्य का उपयोग कर सकते हैं - उदाहरण के लिए Where()/WHERE - और इसलिए सर्वर से वापस लाए गए डेटा को कम करें (हालांकि स्पष्ट रूप से यूडीएफ को अभी भी निष्पादित करने की आवश्यकता होगी कुछ रास्ता)।

Here's a similar example, डेटा-संदर्भ पर उपयोग पर एक छद्म-यूडीएफ दिखाते हुए, यह दर्शाता है कि विधि का सी # संस्करण उपयोग नहीं किया जाता है।

असल में, मैं वर्तमान में इस तरह के यूडीएफ को "मॉडल से बाहर" डेटा को एक संगत तरीके से प्रदान करने के लिए देख रहा हूं - यानी सिस्टम के एक विशेष भाग को कुछ डेटा तक पहुंच की आवश्यकता होती है (जो एक ही डेटाबेस में होती है) वास्तव में एक ही मॉडल का हिस्सा नहीं है, लेकिन जो मैं दिलचस्प तरीके से JOIN करना चाहता हूं। मेरे पास इस उद्देश्य के लिए मौजूदा एसपी भी हैं ... इसलिए मैं उन एसपी को टैब्यूलर यूडीएफ में पोर्ट करने के लिए देख रहा हूं, जो आउट-ऑफ-मॉडल डेटा के आस-पास अनुबंध/अमूर्तता का स्तर प्रदान करता है। इसलिए क्योंकि यह मेरे मॉडल का हिस्सा नहीं है, मैं इसे केवल यूडीएफ के माध्यम से प्राप्त कर सकता हूं - फिर भी मैं इसे अपने नियमित मॉडल के साथ लिखने की क्षमता बनाए रखता हूं।

1

मेरा मानना ​​है कि this MSDN documentation वह है जो आप बाद में हैं (this wider topic of calling user-defined functions in LINQ to SQL के हिस्से के रूप में)। यह नहीं कह सकता कि मैंने इसे स्वयं किया है, लेकिन यह सही लगता है ...

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। – gotqn

+1

@gotqn: दरअसल, और मैं निश्चित रूप से आज ऐसा करूँगा। ध्यान रखें कि यह जवाब स्टैक ओवरफ्लो की बचपन में पोस्ट किया गया था ... –

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