35

मैं अपने एंटिटी फ्रेमवर्क मॉडल में SQL सर्वर के CONTAINS() फ़ंक्शन को आयात करने का प्रयास कर रहा हूं ताकि मैं इसे अपने LINQ प्रश्नों में उपयोग कर सकूं।SQL सर्वर के CONTAINS() को मॉडल परिभाषित फ़ंक्शन के रूप में आयात करना

मैं अपने ईडीएम को यह जोड़ लिया है:

<Function Name="FullTextSearch" ReturnType="Edm.Boolean"> 
    <Parameter Name="Filter" Type="Edm.String" /> 
    <DefiningExpression> 
     CONTAINS(*, Filter) 
    </DefiningExpression> 
</Function> 

मेरे विधि ठूंठ बनाया:

[EdmFunction("MyModelNamespace", "FullTextSearch")] 
public static bool FullTextSearch(string filter) 
{ 
    throw new NotSupportedException("This function is only for L2E query."); 
} 

मैं इस तरह फ़ंक्शन को कॉल करने का प्रयास करें:

from product in Products 
where MyModel.FullTextSearch("FORMSOF(INFLECTIONAL, robe)") 
select product 

निम्नलिखित अपवाद उठाया गया है:

The query syntax is not valid. Near term '*' 

मुझे एहसास है कि मैंने जो फ़ंक्शन परिभाषित किया है वह सीधे पूछे जाने वाले इकाई सेट से जुड़ा हुआ नहीं है ताकि यह भी एक समस्या हो।

क्या इसे खींचने का कोई तरीका है?

+0

संभावित डुप्लिकेट? http://stackoverflow.com/questions/224475/is-it-possible-to-use-full-text-search-fts-with-linq – Pondlife

+2

इस प्रश्न में सुझाया गया समाधान तालिका-मूल्यवान फ़ंक्शन आयात करना है, जो कि LINQ से SQL के लिए काम करता है लेकिन इकाई फ्रेमवर्क के लिए नहीं (वर्तमान) –

उत्तर

3

समारोह आप ऊपर को परिभाषित किया है इकाई एसक्यूएल का उपयोग करता है, एसक्यूएल लेनदेन नहीं है, इसलिए मुझे लगता है कि पहला कदम बाहर शामिल हैं कि क्या (*, 'पाठ') इकाई एसक्यूएल में व्यक्त किया जा सकता खोजा जाए।

इकाई एसक्यूएल को यहां बताए गए * ऑपरेटर का समर्थन नहीं करता: http://msdn.microsoft.com/en-us/library/bb738573.aspx और अगर मैं

entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(*, 'text')"); 

कोशिश मैं एक ही त्रुटि आप ऊपर हो गया मिलता है। मैं स्पष्ट रूप से स्तंभ यह काम करता है पारित करने के लिए प्रयास करते हैं तो:

entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(t.COLUMN_NAME, 'text')"); 

लेकिन जब मैं एसक्यूएल को देखो यह एक तरह अभिव्यक्ति के लिए यह अनुवाद।

ADO.NET:Execute Reader "SELECT 
[GroupBy1].[A1] AS [C1] 
FROM (SELECT 
    COUNT(1) AS [A1] 
    FROM [dbo].[TABLE_NAME] AS [Extent1] 
    WHERE (CASE WHEN ([Extent1].[COLUMN_NAME] LIKE '%text%') THEN cast(1 as bit) WHEN (NOT ([Extent1].[COLUMN_NAME] LIKE '%text%')) THEN cast(0 as bit) END) = 1 
) AS [GroupBy1]" 

आप इकाई एसक्यूएल का उपयोग कर क्वेरी व्यक्त नहीं कर सकते, तो आप सीधे चलाना एसक्यूएल उपयोग करने के लिए एक संग्रहीत प्रक्रिया या अन्य तंत्र का उपयोग करना होगा।

1

यह मैं परे तरीका है, लेकिन आप की कोशिश कर सकते

from product in Products where MyModel.FullTextSearch(product, "FORMSOF(INFLECTIONAL, robe)") select product 

मेरे तर्क है कि एसक्यूएल सर्वर में यह दो पैरामीटर की उम्मीद कर रहा है।

1

मैंने कॉन्टेक्स्ट क्लास से प्राप्त कक्षा में मेरे कोड में एक छोटा सा फ़ंक्शन डाला, जो मेरे SQL फ़ंक्शन को पूर्ण पाठ खोज का समर्थन करने के लिए इंगित करता है, मेरा समाधान थोड़ा और बंद हो गया है (विनिर्देश की अनुमति नहीं पाठ खोज का प्रकार), यह एक आईनेमरेबल लौटाता है, अनिवार्य रूप से खोज मानदंडों से मेल खाने वाली प्राथमिक कुंजी की एक सूची, इस तरह कुछ;

public class myContext : DataContext 
{ 

    protected class series_identity 
    { 
      public int seriesID; 

      series_identity() { } 
    }; 

      [Function(Name = "dbo.fnSeriesFreeTextSearchInflectional", IsComposable = true)] 
      protected IQueryable<series_identity> SynopsisSearch([Parameter(DbType = "NVarChar")] string value) 
      { 
       return this.CreateMethodCallQuery<series_identity>(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), value); 
      } 

      public IEnumerable<int> Search(string value) 
      { 
       var a = from t1 in SynopsisSearch(value) 
         select t1.seriesID; 

       return a; 
      } 
}; 

उपयोग की तरह कुछ है,

myContext context = new myContext(); 

IEnumerable<int> series_identities = (from t1 in context.Search("some term") 
                select t1).Distinct(); 
संबंधित मुद्दे