0

次のコードでスタック オーバーフローが発生しています。私は問題が何であるかを知っています.

           Children = new LazyList<Page>(from p in GetAllPages(language)
                                         where p.ParentPage == s.Id
                                         select p)

p.ParentPage == s.Id を追加する前に

private IQueryable<Page> GetAllPages(string language)
{
    return from s in context.Pages
           where (from c in GetAllContent()
                  where c.PageId == s.Id &&
                        c.Language.ToLower() == language.ToLower()
                  select c).Any()

           let contents = (from c in GetAllContent()
                           where c.PageId == s.Id
                           select c)
           select new Page()
           {
               Id = s.Id,
               SiteId = s.SiteId,
               Type = s.Type,
               Template = s.Template,
               ParentPage = s.ParentPage,
               Visible = s.Visible,
               Order = s.Order,

               Contents = contents.ToList(),
               Children = new LazyList<Page>(from p in GetAllPages(language)
                                             where p.ParentPage == s.Id
                                             select p)
           };
}

どうすればこれを正しく行うことができますか?

更新: コードの背後にある理由は、ツリー構造のメニューがあり、1 つのメニュー項目に 0 から多くの子項目を含めることができるためです。言語部分はスキップできますが、私のサイトは複数の言語をサポートしており、言語パラメーターを使用すると、特定の言語のコンテンツを持つメニュー項目のみが必要になります。

4

1 に答える 1

0

これを呼び出した瞬間から、GetAllPages(language)変更せずに再度呼び出すと、language100%スタックオーバーフローが発生します。

同じではなく、違うものを手に入れる必要があります!そしてあなたの唯一のパラメータはでありlanguage、これは変更されません。

private IQueryable<Page> GetAllPages(string language)
{
 ....
   Children = new LazyList<Page>(from p in GetAllPages(language) // <-- here you 
          // call him self again with the same parametre.
          // Your function is going to call him self asking the same think
          //  This is bring the stack overflow
          //  When you make call to the same function you need some how
          //   to get different results with some different parameter.
于 2012-05-22T07:10:23.503 に答える