linq to sql eager load self referencing property

时间:2012-08-28 18:06:51

标签: asp.net-mvc asp.net-mvc-3 linq-to-sql

我正在尝试进行一次数据库调用以加载我的菜单,但在研究之后我注意到没有可用于自引用表的急切加载。现在它看起来像这样:

public ActionResult PopulateHeaderMenu()
{
 using (var context = ww.WebObjs.WebDataContext.Get())
 {
    var menus = from menu in context.MenuCaches
    where menu.URL == "MENU" && menu.ParentID == -1
    select new MenuModel
    {
        ID = menu.ID,
        Children = from x in menu.Children
                select new MenuModel
                {
                   ID = x.ID,
                   Children = from y in x.Children
                            select new MenuModel
                            {
                                ID = y.ID,
                                Children = from p in y.Children
                                    select new MenuModel
                                    {
                                      ID = p.ID,
                                      Children = from r in p.Children
                                      select new MenuModel 
                                      {
                                        ID =r.ID,
                                        Children = from s in r.Children     
                                        select new MenuModel
                                        {
                                          ID =s.ID,
                                          Children = from t in s.Children
                                             select new MenuModel
                                             {
                                               ID = t.ID,
                                             }
                                        }
                               }
                      }
                  }
            }
         };
         var model = menus.First();
         return PartialView("_NaviPartial", model);
        }

    }

这很有效,但它会生成113个单独的查询。我尝试过做DataLoadWith(),但不能自己引用属性。有没有其他方法可以做我想在这里做的事情?我采取了错误的做法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

几年前我做了类似的事情(并且无法访问代码)。关键是加载平面表一次,然后遍历项目,为父实体设置本地(未映射)属性。有了它,您可以随意通过这些未映射的属性浏览树,只获取图形一次。不幸的是,您不能将LoadWith选项用于自引用实体(请参阅http://www.thinqlinq.com/Default/Managing-self-referencing-tables-with-LINQ-to-SQL.aspx)。