0

私は、特定の基準で結果セットをフィルタリングするための可能な方法を見つけるのに苦労してきました。そのうちの1つは全文検索です。スキミングした後、Linqが直接サポートしていないことを知ったブログはほとんどなく、回避策があります

そのため、そのアプローチから始めましたが、.net 4.0ではテーブル値関数を使用できません(.net 4.5はサポートしていますが、現在は使用できません(関数のインポート))。

次に、ssdlファイルを編集して関数の詳細を追加することでカスタム関数を使用する別の回避策に出くわします(カスタムクエリにコマンドテキストを使用)

私のUDFは以下のようになります:-

CREATE FUNCTION udf_CandidateFTS
(   
    @keywords nvarchar(4000)
)
RETURNS @resCandidates TABLE
(
    CandidateID INT,
    FileRank INT
)
AS
BEGIN

    INSERT INTO @resCandidates
    (
        CandidateID,
        FileRank
    )
    SELECT c.CandidateID, fileContent.Rank as FileRank
            FROM CONTAINSTABLE (FileContent, Content, @keywords) as fileContent
            INNER JOIN [file] f on f.ContentID = fileContent.[Key]
            INNER JOIN [Candidate_Resume] c on c.CandidateID = f.[ID]

    RETURN
END

SSDLファイルを編集しました:-

 <Function Name="GetCandidateWithTextSearch" IsComposable="false">
    <CommandText>
      SELECT * from
      dbo.udf_CandidateFTS(@keywords)
    </CommandText>
    <Parameter Name="keywords" Type="nvarchar" Mode="In" />
  </Function>

そしてEDMFunctionを追加しました:-

    public class MyFunctions
    {
        [EdmFunction("MMJ.Service.Data", "GetCandidateWithTextSearch")]
        public static IList GetCandidateWithTextSearch(string keywords)
        {
            throw new NotSupportedException();
        }
    }

そして、他のフィルターと一緒に私は次のことをしたいです:-

 var query = context.Candidate
.Where(c => c.ID.Equals(MyFunctions.GetCandidateWithTextSearch("wali")
.Contains(c.ID))).ToList();

親切に助けてください!

4

1 に答える 1

1

うまくいかないだろう。最初の回避策は、マップされたテーブル値関数を使用することです。これには.NET4.5が必要です。2番目の回避策は、ストアドプロシージャと同等のマッピングを使用することです。これら2つの違いは次のとおりです。

  • 最初は構成可能です。Linq-to-entitiesクエリで使用でき、SQL関数呼び出しに変換されます。
  • 2番目は構成できません。実行して列挙するだけです。他のすべては、Linq-to-objectsとしてアプリケーションで実行する必要があります。

.NET 4.0では、2番目のアプローチを使用して、SQLクエリ全体をDefiningQueryセクションに記述するのが最善のオプションです(アプリケーションから条件を追加することはできません)。または、ストアドプロシージャを作成し、デザイナーを介してマップします。

于 2013-03-19T21:30:59.290 に答える