如何在Linq(.net 4.0)中实现全文搜索

时间:2013-03-19 21:07:20

标签: entity-framework c#-4.0 lambda linq-to-entities

我一直在努力寻找一种可能的方法来实现在某些标准上过滤我的结果集,其中一个标准是全文搜索。浏览后,很少有博客知道Linq没有直接支持它,并且有一个work around是有意义的。

所以我开始使用这种方法,但是当它发生在我身上时,我无法使用.net 4.0中的表值函数(.net 4.5确实支持我现在不能使用(函数导入))。< / p>

然后我遇到另一个work around来通过编辑ssdl文件并添加功能细节来使用自定义函数(使用commandtext进行自定义查询)。

我的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>

并添加了EDM功能: -

    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();

请帮忙!

1 个答案:

答案 0 :(得分:1)

它无效。第一种解决方法是使用映射表值函数 - 它需要.NET 4.5。第二种解决方法是使用等效于存储过程的映射。这两者之间的差异是:

  • 第一个是可组合的。它可以在Linq-to-entities查询中使用,并转换为SQL函数调用。
  • 第二个不可组合。它可以只执行和枚举。其他所有内容必须在您的应用程序中作为Linq-to-objects运行。

在.NET 4.0中,最好的选择是使用第二种方法并在DefiningQuery部分中编写整个SQL查询(不能从应用程序中添加更多条件)。或者只是创建存储过程并通过设计器进行映射。