0

データベースに階層ページ構造を作成し、mydomain.com/firstpage/secondpage/thirdpage などのページを取得する必要があるプロジェクトに取り組んでいます。

私は次の、取り除かれたモデルを持っています:

[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 ステートメントで URL を検索する方法を定義する必要があります。

4

1 に答える 1

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();
于 2012-05-22T13:41:04.500 に答える