Linq to Entities - 使用Include()急切加载

Jim*_*m B 9 c# linq-to-entities include eager-loading .net-3.5

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

dbo.tblCategory
dbo.tblQuestion(与tblCategory的 多对一关系)
dbo.tblAnswer(与tblQuestion的 多对一关系)

基本上,我正在尝试做的是当我加载一个类别时,我想加载所有问题和所有答案.

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我并不完全迷恋于此; 如果关系名称在我的模型中发生变化; 构建项目时我不会遇到错误.理想情况下,我想使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,使用上面的代码片段; 我坚持如何深入到Answers表.关于我可以用于这个lambda表达式的任何想法?

Jim*_*m B 8

好; 在这里得到了一些帮助,我能够让这个工作.

基本上,我需要这样做:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

所以,即使看起来我只是为第一个问题提取答案,我实际上已经提取了所有问题的所有答案.

  • 如果你不能在lambda表达式中使用`Include()`,请添加`using System.Data.Entity;`.([SRC](http://stackoverflow.com/a/21005478/1937994)) (7认同)