Example #1
0
        /// <summary>
        /// For a given search request for a gien Document Search View Model returns a collection of
        /// Documents.
        ///
        /// If the skip parameter is provided it means we are using the same filter properties as the last
        /// request and only need to return additional documents.
        /// </summary>
        /// <param name="searchFilterModel"></param>
        /// <returns></returns>
        public DataResult <IList <Document> > ProcessSearchRequest(DocumentSearchFilterModel searchFilterModel)
        {
            var result = new DataResult <IList <Document> >();

            try
            {
                var profiler = MiniProfiler.Current;

                IQueryable <Document> documentQuery;

                using (profiler.Step("Search Documents: Getting base query"))
                {
                    documentQuery = _documentRepository.ReadAllAsQueryable();
                }

                using (profiler.Step("Search Documents: Filtering"))
                {
                    // do filtering
                    documentQuery = DoFiltering(searchFilterModel, documentQuery);
                }

                using (profiler.Step("Search Documents: Ordering"))
                {
                    // ordering
                    documentQuery = documentQuery.OrderBy(ent => ent.Title);
                }

                using (profiler.Step("Search Documents: Paging"))
                {
                    // skip and take
                    documentQuery = documentQuery.Skip(searchFilterModel.Skip).Take(searchFilterModel.Take);
                }

                List <Document> documentList;

                using (profiler.Step("Search Documents: To List"))
                {
                    // Set the result as success and set the data
                    documentList = documentQuery.ToList();
                }

                result.SetData(documentList);
                result.SetSuccess();
            }
            catch (Exception ex)
            {
                result.SetException(ex, "Error when searching Documents");
            }

            return(result);
        }
Example #2
0
        /// <summary>
        /// Add the filtering LINQ calls over the document queryable
        /// </summary>
        /// <param name="searchFilterModel"></param>
        /// <param name="documentQuery"></param>
        /// <returns></returns>
        private IQueryable <Document> DoFiltering(DocumentSearchFilterModel searchFilterModel, IQueryable <Document> documentQuery)
        {
            documentQuery = from document in documentQuery

                            // search author name
                            where
                            searchFilterModel.Author == null ||
                            document.AuthorName.ToLower().Contains(searchFilterModel.Author.ToLower())

                            // search the title
                            where
                            searchFilterModel.Title == null ||
                            document.Title.ToLower().Contains(searchFilterModel.Title.ToLower())

                            // filter out the categories
                            //where searchFilterModel.Categories == null ||
                            //searchFilterModel.Categories.All(cat=>document.Categories.Any(c=>c.Name == cat))

                            select document;


            //execute the query and filter categories and keywords in memory
            var resultDocuments = documentQuery.ToList();

            // filter categories if there are any selected from the filter
            if (searchFilterModel.Categories != null && searchFilterModel.Categories.Any())
            {
                resultDocuments = resultDocuments.Where(doc =>
                                                        searchFilterModel.Categories.All(filterCategory => doc.Categories.Any(docCategory => docCategory.Name == filterCategory))).ToList();
            }

            if (searchFilterModel.Keywords != null && searchFilterModel.Keywords.Any())
            {
                resultDocuments = resultDocuments.Where(doc => searchFilterModel.Keywords.All(filterKeyword => doc.Keywords.Any(docKeyword => docKeyword.Name == filterKeyword))).ToList();
            }

            return(resultDocuments.AsQueryable());
        }
        public ActionResult Search(DocumentSearchFilterModel searchFilterModel)
        {
            var results = _documentSearchService.ProcessSearchRequest(searchFilterModel);

            return(Json(_jsonFactory.Build(results, data => data.Select(Mapper.Map <DisplayDocumentViewModel>))));
        }