代码之家  ›  专栏  ›  技术社区  ›  Jim B

linq to entities-使用include()预先加载

  •  9
  • Jim B  · 技术社区  · 16 年前

    我有一个非常基本的表结构:

    丁字裤
    dbo.tbl问题(与tblcategory的多对一关系)
    dbo.tblanswer(与tbl问题的多对一关系)

    所以基本上,我要做的就是当我载入一个类别时,我也要载入所有的问题和答案。

    现在,我已经能够使用以下代码完成此操作:

    public tblCategory Retrieve(int id)
    {
        using (var entities = Context)
        {
            var dto =
                (from t in entities.tblCategory.Include("tblQuestion")
                                               .Include("tblQuestion.tblAnswers")    
                     where t.Id == id
                     select t).FirstOrDefault();
    
                return entities.DetachObjectGraph(dto);
            }
        }
    }
    

    但是,我并不是完全沉迷于此;如果关系名称在我的模型中发生了变化;在构建项目时我不会出错。理想情况下,我想使用lambda表达式;如下所示:

    public tblCategory Retrieve(int id)
    {
        using (var entities = Context)
        {
            var dto =
                (from t in entities.tblCategory.Include(t => t.tblQuestion)
                 where t.Id == id
                 select t).FirstOrDefault();
    
            return entities.DetachObjectGraph(dto);
        }
    }
    

    现在,通过上面的代码片段,我一直在研究如何深入到答案表。对于这个lambda表达式我可以使用什么?

    1 回复  |  直到 10 年前
        1
  •  8
  •   Daniel Sørensen    10 年前

    好的,我能让这个工作,在一些帮助下 here .

    基本上,我需要这样做:

    public tblCategory Retrieve(int id)
    {
        using (var entities = Context)
        {
            var dto =
                (from t in entities.tblCategory.Include(t => t.tblQuestion)
                                               .Include(t => t.tblQuestion.First().tblAnswer)
                 where t.Id == id
                 select t).FirstOrDefault();
    
            return entities.DetachObjectGraph(dto);
        }
    }
    

    从上面的链接,我只能取消对问题集合中各个项目的tblanswer引用。在这里,我选择取消对收藏的第一个项目的tblanswer的引用。实际上,这个lambda表达式只用于生成属性路径__tblQuestion.tblanswers_,它将急切地加载所有问题的答案。

    所以,尽管看起来我只是在拉第一个问题的答案,但实际上我是在拉所有问题的答案。