2012-05-22 151 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