8

को अदिश-मान समारोह कॉल करने के लिए मैं अपने DB में एक अदिश-मान समारोह है:कैसे LINQ से संस्थाओं सर्वर साइड

ALTER FUNCTION [dbo].[fx_fooFunct] 
    (@MyParam varchar(max)) 
RETURNS varchar(max) 
AS 
BEGIN 
    return @MyParam 
END 

मैं संस्थाओं क्वेरी के लिए एक LINQ से इस फ़ंक्शन को कॉल करें और प्राप्त करना चाहते हैं एक चर में परिणाम:

LINQ to Entities does not recognize the method 'System.Data.Objects.ObjectResult`1[System.String] ExecuteFunction[String](System.String, System.Data.Objects.ObjectParameter[])' method, and this method cannot be translated into a store expression.

अन्य मैं:

let result = this.ObjectContext.ExecuteFunction<string>("SELECT dbo.fx_fooFunct(@MyParam)", new ObjectParameter("MyParam", "hello world")).FirstOrDefault() 

लेकिन, जब मैं कोड निष्पादित, मैं इस त्रुटि मिलती है एनएफओ:

यह सर्वर पर चल रही एक क्वेरी का हिस्सा है।
सभी डेटा लौटाना और ऑब्जेक्ट्स के लिए LINQ का उपयोग करना प्रदर्शन के कारण एक विकल्प नहीं है।

मुझे यकीन नहीं है कि मेरे पास ExecuteFunction सही का रिटर्न प्रकार है, लेकिन मुझे यकीन नहीं है कि यह और क्या हो सकता है ... मैं क्या गलत कर रहा हूं?

एसक्यूएल समारोह उजागर सहायक विधि बनाएं::

public class CustomSqlFunctions 
{ 
    [EdmFunction("MyModel.Store", "fx_fooFunct")] 
    public static string FooFunct(string myParam) 
    { 
     throw new NotSupportedException("Direct calls not supported"); 
    } 
} 

LINQ अब पढ़ना चाहिए:

संपादित
Ladislav Mrnka के जवाब की मदद से , यहाँ समाधान है

let result = CustomSqlFunctions.FooFunct("hello world") 

उत्तर

9

क्या आपके पास EDMX में आपका फ़ंक्शन मैप किया गया है? मुझे लगता है कि आप नहीं करते हैं।

भागो डिजाइनर में और संग्रहित प्रक्रियाओं के तहत डेटाबेस जादूगर से अद्यतन आयात और this article का पालन करें सहायक विधि EdmFunctionAttribute के साथ चिह्नित LINQ-से-संस्थाओं के लिए एसक्यूएल समारोह का पर्दाफाश करने के बनाने के लिए करने के लिए अपने एसक्यूएल समारोह का चयन करें।

नोट: SQL फ़ंक्शन कोड-प्रथम/धाराप्रवाह-एपीआई में समर्थित नहीं हैं। आपको EDMX के साथ मैपिंग का उपयोग करने की आवश्यकता है।

ExecuteFunction ईडीएमएक्स में मैप किए गए सुविधाओं को कॉल करने के लिए उपयोग किया जाता है - यह मैप किए गए फीचर (संग्रहीत प्रक्रियाओं के फ़ंक्शन आयात) का नाम अपेक्षा करता है। एमएसडीएन का कहना है कि यह मैप किए गए कार्यों को भी कॉल कर सकता है लेकिन मुझे नहीं पता कि यह कैसे काम करता है और एसक्यूएल फ़ंक्शन आयात में कोई भी नहीं है।

+0

बहुत बढ़िया अदिश महत्वपूर्ण समारोह के लिए कोई समर्थन, बहुत बहुत धन्यवाद है। मैंने समाधान के साथ अपना प्रश्न अपडेट किया है। – mcqwerty

0

ठीक है, आपको सिंगल/स्केलर मान को तालिका मूल्यवान फ़ंक्शन में कनवर्ट करने के लिए SQL को संशोधित करने की आवश्यकता है, तो यह काम करेगा। वहाँ के रूप में अभी तक https://social.msdn.microsoft.com/Forums/en-US/756865e5-ff25-4f5f-aad8-fed9d741c05d/add-scalar-function-to-function-import-folder-in-model-browser-of-entity-framework-40-edmx?forum=adodotnetentityframework

Scalar function as it was, which doesn't work

CREATE FUNCTION [dbo].[GetSha256] 
(
    -- Add the parameters for the function here 
    @str nvarchar(max) 
) 
RETURNS VARBINARY(32) 
AS 
BEGIN 
    RETURN (SELECT * FROM HASHBYTES('SHA2_256', @str) AS HASH256); 
END -- this doesn't work. 

Scalar function -> Converted to Table Valued function , it works

CREATE FUNCTION [dbo].[GetSha2561] 
(
    -- Add the parameters for the function here 
    @str nvarchar(max) 
) 
RETURNS @returnList TABLE (CODE varbinary(32)) 
AS 
BEGIN 

    INSERT INTO @returnList 
    SELECT HASHBYTES('SHA2_256', @str); 

    RETURN; -- This one works like a charm. 

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