2012-05-22 121 views
0

我工作的一个项目,我需要在数据库中创建分层的页面结构,并检索像mydomain.com/firstpage/secondpage/thirdpage等页面的动态递归查询实体框架 - URL

我有以下的,剥离下来,型号:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid PageId { get; set; } 
public string Name { get; set; } 
public string Url { get; set; } 

public Guid? ParentId { get; set; } 
[ForeignKey("ParentId")] 
public virtual Page Parent { get; set; } 
public virtual ICollection<Page> Children { get; set; } 

然后,我有一个功能来查找的PageId,如下所示:

private Guid GetPageByUrl(string slug) 
{ 
    var pages = pageService.GetPages(); 
    var urlArray = slug.Split('/'); 

    var page = new Page(); 

    switch (urlArray.Count()) 
    { 
     case 1: 
      page = pages.Where(p => p.Url == urlArray[0] 
       && p.ParentId == null) 
       .FirstOrDefault(); 
      break; 
     case 2: 
      page = pages.Where(p => p.Url == urlArray[1] 
       && p.Parent.Url == urlArray[0] 
       && p.Parent.ParentId == null) 
       .FirstOrDefault(); 
      break; 
     case 3: 
      page = pages.Where(p => p.Url == urlArray[2] 
       && p.Parent.Url == urlArray[1] 
       && p.Parent.Parent.Url == urlArray[0] 
       && p.Parent.Parent.ParentId == null) 
       .FirstOrDefault(); 
      break; 
     case 4: 
      page = pages.Where(p => p.Url == urlArray[3] 
       && p.Parent.Url == urlArray[2] 
       && p.Parent.Parent.Url == urlArray[1] 
       && p.Parent.Parent.Parent.Url == urlArray[0] 
       && p.Parent.Parent.Parent.ParentId == null) 
       .FirstOrDefault(); 
      break; 
    } 

    return page.PageId; 
} 

有没有什么更好的方法来做到这一点?

由于现在我必须定义如何通过switch-statement来查找URL。

回答

1

你可以做一个循环,以建立从根端查询:

var pageQuery = pageService.GetPages(); 
foreach(Int32 i = 0; i < urlArray.Count(); i++){ 
    var url = urlArray[i]; 
    if (i == 0) // first url must match root page 
     pageQuery = pageQuery.Where(p => p.ParentId == null); 
    else  // next urls must match next level children 
     pageQuery = pageQuery.SelectMany(p => p.Children); 
    pageQuery = pageQuery.Where(p => p.Url == url);  
} 
return pageQuery.FirstOrDefault(); 
+0

谢谢!这比我以前的硬编码更好:) – Fredrik