2013-04-14 6 views
6

मेरी डेटाबेस में मैं कुछ समारोह को परिभाषित, मान लें कि यह fnTest कहा जाता है जाने की है। क्या यह फ़ंक्शन मेरे LINQ/EF क्वेरी से कॉल करना संभव है? कुछ इस तरह:ईएफ LINQ क्वेरी से डीबी फ़ंक्शन को कैसे कॉल करें?

var param3, param4; 
var res = (from x in db.Something 
      where x.field1 > 0 
      orderby fnTest(x.f1, x.f2, param3, param4) 
      select x).Take(20); 

आप देख सकते हैं, मैं उस समारोह डीबी पक्ष पर अमल करने की जरूरत है क्योंकि मैं मूल्य है कि यह देता है का उपयोग करते हुए डेटा को सॉर्ट करने की जरूरत है। पहले दो पैरामीटर तालिका से फ़ील्ड हैं, और दूसरे दो पैरामीटर कुछ संख्याएं हैं जो प्रोग्राम में बदल जाएंगी, लेकिन प्रत्येक क्वेरी के लिए स्थिर रहेंगी।

क्या किसी भी तरह से कॉल फ़ंक्शन को संभवतः डीबी में बनाया गया है? या मुझे इस तरह कुछ उपयोग करने की ज़रूरत है:

((IObjectContextAdapter) context).ObjectContext.CreateQuery 

और मैन्युअल रूप से क्वेरी लिखें?

उत्तर

6

पहले, fnTest डेटाबेस में उपयोगकर्ता परिभाषित समारोह पहले के रूप में बनाया करना होगा :

<Function Name="fnTest" ReturnType="int" Schema="dbo" > 
    <Parameter Name="f1" Mode="In" Type="int" /> 
    <Parameter Name="f2" Mode="In" Type="int" /> 
    <Parameter Name="param3" Mode="In" Type="int" /> 
    <Parameter Name="param4" Mode="In" Type="int" /> 
</Function> 

अब तुम एक विधि को यह समारोह अपने मॉडल में इस तरह बाध्य कर सकते हैं:

[EdmFunction("MyNamespace", "fnTest")] 
public static int fnTest(int f1, int f2, int param3, int param4) 
{ 
    throw new NotSupportedException("Direct calls are not supported."); 
} 

अब आप मानक विधि LINQ क्वेरी में इस विधि का उपयोग कर सकते हैं।

अतिरिक्त पठन

+0

धन्यवाद पता करने के लिए अच्छा है, कि वास्तव में मैं चाहता था! – xx77aBs

1

इकाइयों के लिए एसक्यूएल प्रश्नों का उपयोग करें। exaples के लिए MSDN पर देखो:,

CREATE FUNCTION [fnTest] (@fi int, @f2 int, @param3 int, @param4 int) 
RETURNS int 
AS ... 
फिर अपने .edmx फ़ाइल में

इस तरह समारोह की घोषणा: http://msdn.microsoft.com/en-us/data/jj592907.aspx

+0

Thx, के बारे में है कि :) – xx77aBs

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