我目前正在建立一个论坛,允许用户提出问题并回答问题。
为了使用户更容易查找某个问题,我正在尝试构建一个搜索引擎。
其代码:

List<QuestionDto> dto = _db.Questions.Where(x => (x.Title.Contains(temp) || x.Message.Contains(temp) || (x.User.FirstName + " " + x.User.LastName).Contains(temp) || x.User.LastName.Contains(temp)) && (categoryId == null || x.Category.CategoryId == categoryId))
            .Select(question => new QuestionDto { QuestionId = question.QuestionId,
                Votes = question.Votes, Title = question.Title,
                Message = question.Message, CategoryName = question.Category.Name,
                EditDate = question.EditDate, DateOfCreation = question.DateOfCreation,
                User = new UserDto { UserId = question.User.Id, FirstName = question.User.FirstName, LastName = question.User.LastName, ImageFile = question.User.ImageFile },
                Tags = question.Tags.Select(x => x.Tag).ToList()
            }).ToList();


字符串temp用于搜索问题,以查看标题,消息或用户名是否与查询匹配。

我现在要完成的工作是根据问题中发现的点击量对结果进行排序。因此,例如,如果用户搜索单词“ PHP”,则结果将是:

问题1:发现PHP 10次
问题2:PHP被发现5次
等等

一个人将如何处理呢?

最佳答案

我假设您想在用于通过Contains()在db中搜索的属性列表中找到临时单词的出现。

这是一个逐步的过程,它将为您提供带有问题ID和出现次数的字典。您可以使用此词典对问题列表进行排序。

当然这可以优化。

如果您需要订购问题,可以使用字典并订购。如果只需要显示出现次数,则u将具有字典,该字典将以以下方式为您提供数据:问题#QuestionId,搜索到的字符串的出现次数。

假设单词是PHP,您将拥有:,等等。记录不会在字典中排序。

我为该词典添加了订购步骤。

以后的编辑:如果您尝试在方法中使用Regex,请注意,您不能在select语句中使用Regex,但是可以在将所有记录放入内存之后(在.ToList()之后)使用Regex。请使用以下问题作为参考:Using "Match" in a Linq statement

 List<QuestionDto> dtoQList = _db.Questions.Where(x => (x.Title.Contains(temp) || x.Message.Contains(temp) || (x.User.FirstName + " " + x.User.LastName).Contains(temp) || x.User.LastName.Contains(temp)) && (categoryId == null || x.Category.CategoryId == categoryId))
        .Select(question => new QuestionDto
        {
            QuestionId = question.QuestionId,
            Votes = question.Votes,
            Title = question.Title,
            Message = question.Message,
            CategoryName = question.Category.Name,
            EditDate = question.EditDate,
            DateOfCreation = question.DateOfCreation,
            User = new UserDto { UserId = question.User.Id, FirstName = question.User.FirstName, LastName = question.User.LastName, ImageFile = question.User.ImageFile },
            Tags = question.Tags.Select(x => x.Tag).ToList()
        }).ToList();

        var questionDictionaryMatchings = new Dictionary<int, int>();

        foreach(var question in dtoQList)
        {
            var titleSplited = question.Title.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);

            var messageSplited = question.Message.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);

            var firstNameSplited = question.User.FirstName.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);

            var lastNameSplited = question.User.LastName.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);


            var titleSplitedQuery = from word in titleSplited
                             where word.ToLowerInvariant() == temp.ToLowerInvariant()
                             select word;

            int wordCountTitle = titleSplitedQuery.Count();

            var messageSplitedQuery = from word in messageSplited
                                      where word.ToLowerInvariant() == temp.ToLowerInvariant()
                                    select word;

            int wordCountMessage = messageSplitedQuery.Count();


            var firstNameSplitedQuery = from word in firstNameSplited
                                    where word.ToLowerInvariant() == temp.ToLowerInvariant()
                                    select word;

            int wordCountFirstName = firstNameSplitedQuery.Count();

            var lastNameSplitedQuery = from word in lastNameSplited
                                    where word.ToLowerInvariant() == temp.ToLowerInvariant()
                                    select word;

            int wordCountLastName = lastNameSplitedQuery.Count();

            questionDictionaryMatchings.Add(question.QuestionId, wordCountTitle + wordCountMessage + wordCountFirstName + wordCountLastName);

        }
          //sorted dictionary
          var questionDictionaryMatchingsSorted = from entry in questionDictionaryMatchings orderby entry.Value descending select entry;

关于c# - 根据事件对结果进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37477555/

10-11 03:59
查看更多