0

我一直在努力寻找一种可能的方法来实现根据某些标准过滤我的结果集,其中之一是全文搜索。在浏览了一些博客之后才知道 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

不起作用。第一个解决方法是使用映射表值函数 - 它需要 .NET 4.5。第二种解决方法是使用与存储过程等效的映射。这两者的区别在于:

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

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

于 2013-03-19T21:30:59.290 回答