2011-05-03 15 views
14

मैंने अपने डेटाबेस ऑब्जेक्ट्स के लिए एंटीटी कोडब्लॉक जेनरेट किया है और मेरे कुछ उपयोगकर्ता परिभाषित स्केलर फ़ंक्शंस का चयन किया है। लेकिन जब मैंने मॉडल में फ़ंक्शंस पर डबल क्लिक करने का प्रयास किया। फ़ंक्शन आयात करने के लिए मुझे यह त्रुटि मिलती है।संगत कार्यों के लिए फ़ंक्शन आयात नहीं किए जा सकते हैं

संगत कार्यों के लिए फ़ंक्शन आयात नहीं किए जा सकते हैं।

मैं अपने कार्यों को कैसे आयात कर सकता हूं?

+0

रिटर्न प्रकार क्या है? शायद यह आपकी मदद कर सकता है यदि आपके पास जटिल रिटर्न प्रकार हैं - http://blogs.msdn.com/b/nihitk/archive/2010/04/23/ado-net-entity-designer-in-vs-2010-stored-procedure -return-type-shape-sensing.aspx – VinayC

+0

वर्कर (100) एक जटिल प्रकार नहीं है जो मुझे लगता है ... – Helio

उत्तर

8

मुझे नहीं पता कि मैं निष्पादन समारोह के साथ क्या देख रहा था, लेकिन यह काम नहीं कर रहा था। अंततः मुझे post और अन्य प्रतिक्रियाओं में दिखाए गए आलेख से सहायता के साथ एक अंत तक समाधान मिला।

<Function Name="ProcessReplacements" ReturnType="nvarchar(max)" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="Data"> 
     <Parameter Name="VersionId" Type="uniqueidentifier" Mode="In" /> 
     <Parameter Name="SurveyId" Type="uniqueidentifier" Mode="In" /> 
     <Parameter Name="Input" Type="nvarchar(max)" Mode="In" /> 
    </Function> 

चरण दो सेटअप करने के लिए edmx फ़ाइल के रूप में ही नाम स्थान में एक वर्ग (आसानी से उसी निर्देशिका में वर्ग बनाने के द्वारा किया जाता है:

चरण एक अपने edmx फ़ाइल में समारोह पाने के लिए है edmx फ़ाइल:

using System.Data.Objects; 
    protected string ProcessReplacements(Guid versionId, Guid surveyId, string input) 
    { 
     if (input == null) 
      return null; 

     List<ObjectParameter> parameters = new List<ObjectParameter>(3); 
     parameters.Add(new ObjectParameter("VersionId", versionId)); 
     parameters.Add(new ObjectParameter("SurveyId", surveyId)); 
     parameters.Add(new ObjectParameter("Input", input)); 

     var output = db.CreateQuery<string>("SurveyDesignerModel.Store.ProcessReplacements(@VersionId, @SurveyId, @Input)", parameters.ToArray()) 
      .Execute(MergeOption.NoTracking) 
      .FirstOrDefault(); 

     return output; 
    } 
:

using System.Data.Objects.DataClasses; 
namespace Same.As.Edmx 
{ 
    public static class EdmFunctions 
    { 
     [EdmFunction("SurveyDesignerModel.Store", "ProcessReplacements")] 
     public static string ProcessReplacements(Guid VersionId, Guid SurveyId, string Input) 
     { 
      throw new NotSupportedException("Direct calls are not supported."); 
     } 
    } 
} 

चरण तीन एक वस्तु क्वेरी समारोह की ओर इशारा करते लिखना है

मेरे लिए कुंजी ऑब्जेक्ट संदर्भ और "क्वेरी स्ट्रिंग" के वाक्यविन्यास पर CreateQuery कॉल था। ईडीएमएक्स में परिभाषित फ़ंक्शन के पूर्णतः योग्य संदर्भ पर ध्यान दें, यह मेरा लापता लिंक था :-)

+0

क्या EntityDataSource की कमांडटेक्स्ट संपत्ति में SQL कथन में ऐसे आयातित फ़ंक्शन का उपयोग करने का कोई तरीका है? – Mikhail

+0

वाह, वास्तव में, यह है: http://www.scip.be/index.php?Page=ArticlesNET35#CallingSqlClrAggregatesLinqToEntities – Mikhail

+0

यह कुछ अच्छी जानकारी है, हालांकि, मुझे आपके चरण दो करने की आवश्यकता नहीं है ... बस चरण तीन ने मेरे लिए किया था। – bsara

3

यह सही है। आप SQL फ़ंक्शन के लिए फ़ंक्शन आयात नहीं बना सकते हैं, लेकिन केवल SQL संग्रहीत प्रक्रिया के लिए। आप अपने भंडारण मॉडल के लिए एसक्यूएल समारोह आयात लेकिन आप मैन्युअल रूप से विधि समारोह बनाना होगा कॉल करने के लिए कर सकते हैं:

public static class EdmFunctions 
{ 
    [EdmFunction("TestModel.Store", "FunctionName")] 
    public static string SomeName(string someParam) 
    { 
     throw new NotSupportedException("This function is only for L2E query."); 
    } 
} 

नाम स्थान EdmFunction में दुकान कंटेनर के नाम स्थान होना चाहिए (edmx फ़ाइल में SSDL) और नाम का नाम होना चाहिए आयातित समारोह .NET कोड में बुलाए जाने पर इस विधि को कोई समझ नहीं आता है। इसके कारण यह अपवाद फेंकता है। यह केवल SQL = linq-to-entities में अनुवाद किए गए प्रश्नों के लिए है।

+0

मैंने इस दृष्टिकोण का उपयोग किया है, लेकिन ऐसा लगता है कि यह काम नहीं करता है। यह मैं क्या किया है: सार्वजनिक स्थैतिक कक्षा EdmFunctions { [EdmFunction ("Model.Store", "PKG_TURNUS_SUMUKE")] सार्वजनिक स्थैतिक int turnusSumuke (दशमलव ALNR, दशमलव Atid, दशमलव AUKENR) { फेंक नई NotSupportedException ("यह फ़ंक्शन केवल L2E क्वेरी के लिए है।"); } } मैंने इस फ़ंक्शन को L2E से कहा है लेकिन क्वेरी शून्य हो जाती है। –

2

मुझे एक ही समस्या थी और इसे सफलतापूर्वक हल किया गया। इस विषय पर एक मूल एमएसडीएन आलेख यहां है: How to: Call Custom Database Functions

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