1

Web サイトで高度な検索機能を作成する方法を見つけようとしています。私が現在使用しているコードは効率的ではなく、非常に高価なクエリを作成します。このようなものを作成するための良いリソース/例は何ですか:

私の検索コントローラー:

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() を使用する場合のように) 最後までクエリを一度に 1 つずつ作成するか、述語を使用してクエリを作成します。ビルダー。次の 2 つの質問を見てください。必要なものがすべて揃っている可能性があります。

エンティティ フレームワークを使用した動的クエリの作成

LINQ to EF クエリで動的 where 句を作成する

于 2013-08-30T06:30:06.297 に答える