Linq的全文搜索

ctr*_*3nd 23 linq search full-text-search linq-to-sql

在Linq中没有内置全文搜索,并且似乎没有很多关于这个主题的帖子所以我有一个游戏并为我的utleity类提出了这个方法:

public static IEnumerable<TSource> GenericFullTextSearch<TSource>(string text, MyDataContext context)
{
    //Find LINQ Table attribute
    object[] info = typeof(TSource).GetCustomAttributes(typeof(System.Data.Linq.Mapping.TableAttribute), true);
    //Get table name
    String table = (info[0] as System.Data.Linq.Mapping.TableAttribute).Name;
    //Full text search on that table
    return context.ExecuteQuery<TSource>(String.Concat("SELECT * FROM ", table, " WHERE CONTAINS(*, {0})"), text);
}
Run Code Online (Sandbox Code Playgroud)

并将此包装器添加到每个部分Linq类,其中有一个全文索引

public static IEnumerable<Pet> FullTextSearch(string text, MyDataContext context)
{
    return (LinqUtilities.GenericFullTextSearch<Pet>(text, context) as IEnumerable<Pet>);
}
Run Code Online (Sandbox Code Playgroud)

所以现在我可以用简洁的东西做全文搜索

var Pets = Pet.FullTextSearch(helloimatextbox.Text, MyDataContext).Skip(10).Take(10);
Run Code Online (Sandbox Code Playgroud)

我假设目前只需要进行非常基本的搜索.任何人都可以改进吗?是否可以实现作为扩展方法并避免包装?

小智 6

最好的解决方案是在sql中使用内联表值函数并将其添加到模型中

http://sqlblogcasts.com/blogs/simons/archive/2008/12/18/LINQ-to-SQL---Enabling-Fulltext-searching.aspx

  • 从我所见,这也需要每个表的 udf,OP 解决方案应该适用于所有表。不过谢谢你的帖子 (2认同)

dsw*_*tik -3

你可以做这样的事情

    var results = (from tags in _dataContext.View_GetDeterminationTags
                   where tags.TagName.Contains(TagName) ||
                   SqlMethods.Like(tags.TagName,TagName)
                   select new DeterminationTags
                   {
                       Row = tags.Row,
                       Record = tags.Record,
                       TagID = tags.TagID,
                       TagName = tags.TagName,
                       DateTagged = tags.DateTagged,
                       DeterminationID = tags.DeterminationID,
                       DeterminationMemberID = tags.DeterminationMemberID,
                       MemberID = tags.MemberID,
                       TotalTagged = tags.TotalTagged.Value
                   }).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,TagName.Contains 还包含 SQLMethods.Like,只需使用

using System.Data.Linq.SqlClient;
Run Code Online (Sandbox Code Playgroud)

获得对该 SQLMethods 的访问权限。

  • 该 .contains 转换为 LIKE '%TAGNAME%',这是次优的。 (3认同)