9

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

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

但是,我并不完全迷恋这一点。如果我的模型中的关系名称发生变化;构建项目时我不会出错。理想情况下,我想使用 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 表达式使用什么的任何想法?

4

1 回答 1

8

好的; 在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);
    }
}

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

因此,即使看起来我只是在提取第一个问题的答案,但实际上我是在提取所有问题的所有答案。

于 2010-07-06T19:06:45.817 回答