Я настраиваю систему страниц и подстраниц для сайта.Итак, допустим, есть страница «Index», со страницей «Sub».Для доступа к подстранице URL должен выглядеть следующим образом: «Index / Sub».
Может существовать другая страница с «Sub» для части URL.IE: "Index / Sub" и "AnotherPage / Sub".В ASP.NET MVC я беру URL-адрес и делю его на массив при прямой косой черте.Затем я использую EF4.1 для поиска правильной сущности страницы.
Когда я смотрю на код, он работает, но мне интересно, могу ли я уменьшить количество обращений к базе данных.Вот мое тестовое действие:
public string Index(string url)
{
// split url into array
string[] slugs = url.Split('/');
string currentSlug = slugs[0];
// set starting page and loop
Page page = db.Pages.FirstOrDefault(x => x.Slug == currentSlug);
for (var i = 1; i < slugs.Count(); i++)
{
if (!string.IsNullOrEmpty(slugs[i])
&& page != null
&& page.Children != null)
{
page = page.Children.FirstOrDefault(x => x.Slug == slugs[i]);
}
}
// if null return 404
if(page == null) throw new HttpException(404, "HTTP/1.1 404 Not Found");
// return page
return page.Label;
}
Это страшно или хорошо?Есть ли способ уменьшить потенциальное количество вызовов в БД?
-Спасибо за любые советы-
Редактировать
Вот моя модель страницы FYI
public class Page
{
public Guid PageId { get; set; }
[Required(ErrorMessage = "URL is required")]
[StringLength(30, ErrorMessage = "Must be less than 30 characters")]
public string Slug { get; set; }
[Required(ErrorMessage = "Label is required")]
[StringLength(30, ErrorMessage = "Must be less than 30 characters")]
public string Label { get; set; }
[StringLength(100, ErrorMessage = "Must be less than 100 characters")]
public string Title { get; set; }
[StringLength(255, ErrorMessage = "Must be less than 255 characters")]
public string Keywords { get; set; }
[StringLength(300, ErrorMessage = "Must be less than 300 characters")]
public string Description { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
public string LayoutName { get; set; }
public virtual ICollection<Content> Contents { get; set; }
public virtual Page Parent { get; set; }
public virtual ICollection<Page> Children { get; set; }
}