Linq按比赛数量排序

时间:2011-09-10 00:11:03

标签: c# asp.net linq linq-to-sql search

我有一个字符串数组和一个Linq查询:

/// <summary>
/// Return all the search results
/// </summary>
public static GenericTagEntity[] getSearchResults(int SectionID, string[] Words)
{
    GenericTagEntity[] Recs;

    using (MainContext db = new MainContext())
    {
        var q = (
            from c in db.tblArticles
            join a in db.tblForumAuthors on c.AuthorID equals a.Author_ID
            join u in db.tblProfiles on c.AuthorID equals u.UserID
            where c.IsDeleted == false
            && c.SectionID == SectionID
            select new
            {
                c.Title,
                c.ID,
                c.Anchor,
                c.Date,
                c.Description,
                u.EmailAddress,
                u.UserID,
                a.Username,
                c.Body,
                comments = (from f in db.tblComments where f.IsDeleted == false && f.Anchor == c.Anchor select new { f.ID }).Count()
            });

我想要做的是修改where,以便返回c.Titlec.Body包含一个或多个字词的结果。然后我需要按总比赛排序(最相关的第一个)!

这对我来说真的很难,非常感谢任何帮助。

我发现了这个,但它只是部分有用,SO搜索也没有产生很多结果。 http://msdn.microsoft.com/en-us/library/bb546166.aspx#Y200

2 个答案:

答案 0 :(得分:3)

遗憾地打破它给你,但你用错误的工具来解决这个问题。在db中创建全文索引并通过自定义函数从LINQ调用全文搜索,或使用第三方全文搜索系统Lucene。

如果你真的想在sql中这样做,那就算不了。文档中单词的实例将要求您更改数据库模式。

你需要一个单词表(id,word)和一个出现表(wordid,articleid)然后你可以对出现表进行查询以获得你想要的结果。

答案 1 :(得分:3)

我相信这会解决问题

var occurrences = from e in q.Title.Split(new char[] { ' ' }).Concat(q.Body.Split(new char[] { ' ' }))
             join word in Words on e equals word
             group e by e into g
             select new {element = g, count = g.Count()} into result
             orderby result.count descending
             select result;

查询将生成一个单词列表,这些单词在标题或正文中按发生次数降序排列。