C# 根据出现的情况对结果进行排序

C# 根据出现的情况对结果进行排序,c#,asp.net-mvc,entity-framework,linq,C#,Asp.net Mvc,Entity Framework,Linq,我目前正在建立一个论坛,允许用户提问和回答问题。 为了方便用户查找某个问题,我正在尝试构建一个搜索引擎。 以下代码: 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.C

我目前正在建立一个论坛,允许用户提问和回答问题。 为了方便用户查找某个问题,我正在尝试构建一个搜索引擎。 以下代码:

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();
List dto=\u 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.categoryId==categoryId))
.Select(question=>newquestiondto{QuestionId=question.QuestionId,
投票=问题。投票,标题=问题。标题,
Message=question.Message,CategoryName=question.Category.Name,
EditDate=question.EditDate,创建日期=question.DateOfCreation,
User=newuserdto{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将拥有字典,该字典将以以下方式向您提供数据:问题#问题ID,搜索字符串的出现次数

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

我为那本词典增加了一个订购步骤

稍后编辑:如果您试图在方法中使用正则表达式,请注意,您不能在select语句中使用正则表达式,但可以在将所有记录放入内存后使用正则表达式(在
.ToList()
之后)。请参考以下问题:

List 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.categoryId==categoryId))
.选择(问题=>新问题到
{
QuestionId=question.QuestionId,
投票=问题。投票,
标题=问题。标题,
消息=问题。消息,
CategoryName=question.Category.Name,
EditDate=question.EditDate,
创建日期=问题。创建日期,
User=newuserdto{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=新字典();
foreach(dtoQList中的var问题)
{
var titleSplited=question.Title.Split(新字符[]{'.','?','!',''.;',':','},StringSplitOptions.RemoveEmptyEntries);
var messageSplited=question.Message.Split(新字符[]{'.','?','!','.';',':',','},StringSplitOptions.RemoveEmptyEntries);
var firstNameSplited=question.User.FirstName.Split(新字符[]{.''.','?','!',''.';':',','},StringSplitOptions.RemoveEmptyEntries);
var lastNameSplited=question.User.LastName.Split(新字符[]{.''.','?','!',''.';':',','},StringSplitOptions.RemoveEmptyEntries);
var titleSplitedQuery=来自titleSplited中的单词
其中word.ToLowerInvariant()==temp.ToLowerInvariant()
选择单词;
int-wordCountTitle=titleSpliteQuery.Count();
var messageSplitedQuery=来自messageSplited中的单词
其中word.ToLowerInvariant()==temp.ToLowerInvariant()
选择单词;
int-wordCountMessage=messageSplitedQuery.Count();
var firstNameSplitedQuery=来自firstNameSplited中的单词
其中word.ToLowerInvariant()==temp.ToLowerInvariant()
选择单词;
int-wordCountFirstName=firstNamespliteQuery.Count();
var lastNameSplitedQuery=来自lastNameSplited中的单词
其中word.ToLowerInvariant()==temp.ToLowerInvariant()
选择单词;
int-wordCountLastName=LastNamespliteQuery.Count();
添加(question.QuestionId,wordCountTitle+wordCountMessage+wordCountFirstName+wordCountLastName);
}
//分类词典
var questionDictionaryMatchingsSorted=来自questionDictionaryMatchings orderby条目中的条目。值递减选择条目;

在编程问答网站上询问有关您问答网站的编程问答。。。大胆的举动:-)
 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;