/// <summary>
        /// Returns a product given its id, or null if the id does not match a product.
        /// </summary>
        /// <param name="productId"></param>
        /// <returns></returns>
        public Product GetProductById(int productId)
        {
            using (var context = new searchpdEntities())
            {
                Product product = context.Products.Find(productId);

                return product;
            }
        }
        /// <summary>
        /// Returns a category given its id, or null if the id does not match a category.
        /// </summary>
        /// <param name="categoryId"></param>
        /// <returns></returns>
        public Category GetCategoryById(int categoryId)
        {
            using (var context = new searchpdEntities())
            {
                Category category = context.Categories.Find(categoryId);

                return category;
            }
        }
        /// <summary>
        /// Gets all product suggestions from the database.
        /// </summary>
        /// <returns></returns>
        public IEnumerable<ProductSuggestion> GetAllSuggestions()
        {
            using (var context = new searchpdEntities())
            {
                IEnumerable<ProductSuggestion> suggestions =
                    context.Products.Select(p => new ProductSuggestion {
                        ProductCode = p.Code,
                        ProductId = p.ProductID
                    }).ToList();

                return suggestions;
            }
        }
        /// <summary>
        /// Gets all product search results from the database.
        /// 
        /// This simply retrieves all Products from the database and returns them as
        /// ProductSearchResults.
        /// </summary>
        /// <returns></returns>
        public IEnumerable<ProductSearchResult> GetAllProductSearchResults()
        {
            using (var context = new searchpdEntities())
            {
                IEnumerable<ProductSearchResult> results =
                    context.Products.Select(p => new ProductSearchResult
                    {
                        ProductDescription = p.Description,
                        ProductCode = p.Code,
                        ProductId = p.ProductID
                    }).ToList();

                return results;
            }
        }
        /// <summary>
        /// Gets all category suggestions from the database.
        /// </summary>
        /// <returns></returns>
        public IEnumerable<CategorySuggestion> GetAllSuggestions()
        {
            using (var context = new searchpdEntities())
            {
                // This will not return the top most category WEBONLINE, because its 0 ParentID doesn't join with any other category.
                IEnumerable<CategorySuggestion> suggestions =
                    context.Categories.Join(
                        context.Categories,
                        c => c.ParentID,
                        p => p.CategoryID,
                        (c, p) => new CategorySuggestion
                            {
                                CategoryName = c.Name,
                                CategoryId = c.CategoryID,
                                ParentName = (p.ParentID == 0) ? "" : p.Name,
                                ParentId = (p.ParentID == 0) ? 0 : p.CategoryID
                            }).ToList();

                //TODO: Optimise this by using a left join instead

                return suggestions;
            }
        }