35

LINQクエリで使用できるように、Entity FrameworkモデルでSQL ServerのCONTAINS()関数をインポートしようとしています。モデル定義関数としてSQL ServerのCONTAINS()をインポートする

私はEDMにこれを追加しました:私はこのような機能を呼び出そう

[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 

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

の追加は、私のメソッドスタブを作成しました例外が発生しました:

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 to SQLでは動作しますが、Entity Frameworkでは(currenty)動作しません。 –

答えて

3

あなたは上で定義されている機能は、エンティティSQLを使用して、SQLをのTransactないので、私は最初のステップは、(*、「テキスト」)含まれているかどうかを把握することだと思うは、Entity SQLで表現することができます。ここで説明するように

エンティティSQLは、*演算子をサポートしていません: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')"); 

しかし、私はそれをLIKE式に翻訳しました。

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]" 

Entity SQLを使用してクエリを表現できない場合は、ストアドプロシージャまたはその他のメカニズムを使用してTransact SQLを直接使用する必要があります。

1

これは私を超えた方法ですが、あなたは私の推論は、SQL Serverで、それは2つのパラメータを期待しているということです

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

を試みることができます。

1

フルテキスト検索をサポートするSQL関数を指しているContextクラスを継承したクラスで、私のコードに少し機能が挿入されました。テキスト検索のタイプ​​)、IEnumerableを返します。基本的に検索条件に一致する主キーのリストです。

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(); 
関連する問題