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