1

我试图弄清楚如何在我的网站上制作高级搜索功能。我现在使用的代码效率不高,并且创建了一个非常昂贵的查询。什么是创建这样的东西的好资源/示例:

我的搜索控制器:

public ActionResult Index(string q = null, string authors = null, string category = null, decimal rating = 0, string published = null, int completed = 0, int page = 0)
        {
            List<string> categories = new List<string>();
            List<string> authorss = new List<string>();
            DateTime DateBy = new DateTime();
            DateTime.TryParse(published, out DateBy);

            if(!string.IsNullOrEmpty(authors))
                authorss = authors.Split(',').ToList();
            if (!string.IsNullOrEmpty(category))
                categories = category.Split(',').ToList();


            IEnumerable<Comic> Comics = db.Comics.Where(i => i.Title.Contains(q)).Include(i => i.ComicRatings).Include(i => i.ComicAuthors).Include("ComicAuthors.User");

            if(authorss.Count() >= 1)
            {
                Comics = Comics.Where(i => i.ComicAuthors.Where(j => authorss.Contains(j.User.UserName)).GroupBy(j => j.Comic_Id).Where(j => j.Count() >= authorss.Count()).Any());
            }

            if (categories.Count() >= 1)
            {
                Comics = Comics.Where(i => i.ComicCategories.Where(j => categories.Contains(j.Category.Name)).GroupBy(j => j.Comic_Id).Where(j => j.Count() >= categories.Count()).Any());
            }

            if (rating != 0)
            {
                Comics = Comics.Where(i => i.ComicRatings.Where(j => j.Rating >= rating).Any());
            }

            if (completed == 1)
            {
                Comics = Comics.Where(i => i.Completed == false);
            }
            else if (completed == 2)
            {
                Comics = Comics.Where(i => i.Completed == true);
            }

            if (!string.IsNullOrEmpty(published))
            {
                Comics = Comics.Where(i => i.DatePublished >= DateBy);
            }

            if(page <= (Comics.Count() / 20))
                page = 0;

            Comics = Comics.Skip(page * 20).Take(20);

            IEnumerable<LocalComicCategoriesModel> testing = helper.getCategories();
            ViewSearchModel post = new ViewSearchModel
            {
                Comic = Comics.ToList(),
                Categories = testing
            };

            return View(post);
        }
4

2 回答 2

1

如果您尝试进行大量文本搜索,我会看看 Lucene.Net Lucene 是一个非关系型全文搜索引擎,在很多地方都在使用。

我们花了很长时间尝试在 sql 和 linq 中进行文本搜索,然后将其全部扔掉并拥有一个完全专用的搜索系统。

于 2013-08-30T06:10:37.960 回答
0

我认为您的主要问题来自您检索太多漫画然后尝试过滤它们的事实。作为第一步,我会尝试限制从数据库中检索的漫画数量。为此,您可以一次构建查询一个过滤器,而不会真正导致它执行(就像您在调用结束时使用 Any() 所做的那样)直到最后,或者使用谓词构建查询建设者。看看这两个问题,因为它们可能会提供您所需要的一切:

使用实体框架创建动态查询

在 LINQ to EF 查询中构建动态 where 子句

于 2013-08-30T06:30:06.297 回答