В Entity Framework 4.1. Есть ли лучший способ найти подстраницы с помощью URL? - PullRequest
0 голосов
/ 24 октября 2011

Я настраиваю систему страниц и подстраниц для сайта.Итак, допустим, есть страница «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; }
}

1 Ответ

1 голос
/ 24 октября 2011

Я бы обязательно включил полный путь к каждой Page, так что вы можете выполнить запрос за один вызов БД.(Да, тогда данные не будут полностью нормализованы в БД, но это жертва, которую нам иногда приходится жертвовать ради производительности).Просто убедитесь, что у вас есть стратегия обновления подстраниц при каждом изменении родительской страницы.

Если вам не нравится идея столбца полного пути на страницах, возможно, вам следует кэшировать пути и идентификаторы страниц, которые они разрешаютвместо того, чтобы каждый раз запрашивать БД (не забудьте иметь стратегию очистки кэша).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...