在实体框架4.1中,有没有更好的方法来使用URL查找子页面?

时间:2011-10-24 18:09:51

标签: c# entity-framework

我正在为网站设置页面和子页面系统。所以,假设有一个“索引”页面,带有“子”页面。要访问子页面,URL将如下所示:“Index / Sub”。

URL部分可能有另一个带有“Sub”的页面。 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 个答案:

答案 0 :(得分:1)

我当然会在每个Page上包含完整页面路径,因此您可以在一次数据库调用中执行查询。 (是的,那么数据将不会在数据库中完全标准化,但我们有时必须为了性能而牺牲)。只要确保你有一个策略来在父页面发生变化时更新子页面。

如果您不喜欢页面上的完整路径列的想法,也许您应该缓存它们解析的路径和页面ID,而不是每次都要求DB(记住要有缓存清除策略)。