0

我收到以下代码的堆栈溢出。我知道问题是什么,它执行了所有“GetAllPages”

           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)
           };
}

我该如何正确地做到这一点?

更新:代码背后的原因是,我有一个树形结构的菜单,其中一个菜单项可以有 0 到多个子项。可以跳过语言部分,但我的网站支持多种语言,并且使用语言参数我只希望菜单项具有给定语言的内容。

4

1 回答 1

0

从您调用 this 的那一刻起,GetAllPages(language)然后再次调用它而不进行更改,language您将获得 100% 的堆栈溢出。

你需要得到不同的东西,不一样的!你唯一的参数是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 回答