我試圖將搜索引擎添加到我的網站,您可以在其中通過選擇一個類別來搜索產品。類別樹有這樣一個架構:如何通過在MVC4中給出'頭部'類別來搜索子類別
- HeadCategory1
- 子類別1
- SubSubCategory1
- SubSubCategory2
- SubCategory2
- 子類別1
- HeadCategory2
- SubCategory3
- HeadCategory3
在搜索表單,你只能從HeadCategories選擇(從DB拉)。 如何創建一個(遞歸)函數,在您選擇的HeadCategory中進行搜索,並在該頭類別的子類別和子類別中進行搜索?
我的搜索代碼如下所示:
[HttpPost]
public ActionResult Search(SearchCriteria model, int? page)
{
UnitOfWork _uow = new UnitOfWork();
int pageNumber = page ?? 1;
var query = _uow.ProductRepository.Get(
includeProperties: "Author"
);
// Search terms
string[] keywords = new string[1];
if (model.Keywords != null && model.Keywords.Length > 0 && model.Keywords.Contains(' '))
keywords = model.Keywords.Split(' ');
else
keywords[0] = model.Keywords;
if (keywords[0] != null)
{
foreach (string word in keywords)
{
query = query.Where(p => p.Description.Contains(word) || p.Name.Contains(word));
}
}
if (model.CategoryId > 0 && query.Count() > 0)
{
// HERE IS WHERE THE CHANGES SHOULD BE MADE
query = query.Where(r => r.CategoryId == model.CategoryId);
}
List<Product> zipResults = query.ToList();
RangeResult[] postcodes;
int postcode;
if (model.Distance > 0 && int.TryParse(model.Zipcode.Substring(0, 4), out postcode))
{
// Calls a function that uses a SOAP service
postcodes = range(postcode, model.Distance);
foreach(Product result in query)
{
if (result.Author.Zipcode == null)
continue;
foreach (RangeResult rr in postcodes)
{
if (result.Author.Zipcode.Contains(rr.nl_fourpp.ToString()))
zipResults.Add(result);
}
}
}
//results = results.ToPagedList(pageNumber, PAGE_SIZE);
return View("Resultaten", new SearchResultsVM
{
Products = zipResults.ToList().ToPagedList(pageNumber, PAGE_SIZE),
Count = zipResults.Count()
});
而且,我想這個搜索引擎的代碼是不是處於最佳狀態,所以如果你有一些提示/改進,請與我分享。
編輯: 我的分類模型是這樣的:
public class Category
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int? ParentId { get; set; }
public virtual Category Parent { get; set; }
public virtual ICollection<Category> Subcategories { get; set; }
public decimal PostCosts { get; set; }
public byte[] Image { get; set; }
public virtual ICollection<Product> Products { get; set; }
public string Slug { get; set; }
public override string ToString()
{
return Name;
}
}
編輯: 是否聰明,只是在類表中添加一個額外的列,給它的「頭部」類別的ID具體類別?或者可能是一個額外的表,將類別ID與其相應的頭部類別相結合?
感謝您的評論!但是,如果我希望它給出'IEnumerable'的結果,我該如何做到這一點? –
devqon