我一直在努力寻找一种可能的方法来实现在某些标准上过滤我的结果集,其中一个标准是全文搜索。浏览后,很少有博客知道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();
请帮忙!
答案 0 :(得分:1)
它无效。第一种解决方法是使用映射表值函数 - 它需要.NET 4.5。第二种解决方法是使用等效于存储过程的映射。这两者之间的差异是:
在.NET 4.0中,最好的选择是使用第二种方法并在DefiningQuery
部分中编写整个SQL查询(不能从应用程序中添加更多条件)。或者只是创建存储过程并通过设计器进行映射。