我正在为网站设置页面和子页面系统。所以,假设有一个“索引”页面,带有“子”页面。要访问子页面,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; }
}
答案 0 :(得分:1)
我当然会在每个Page
上包含完整页面路径,因此您可以在一次数据库调用中执行查询。 (是的,那么数据将不会在数据库中完全标准化,但我们有时必须为了性能而牺牲)。只要确保你有一个策略来在父页面发生变化时更新子页面。
如果您不喜欢页面上的完整路径列的想法,也许您应该缓存它们解析的路径和页面ID,而不是每次都要求DB(记住要有缓存清除策略)。