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

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

现在,使用上面的代码片段;我卡在如何深入到Answers表中。你有什么关于这个问题的lambda表达式的想法吗?


据我所知,.NET 4.0中的Linq to Entities支持延迟加载(默认启用)。那么你就不需要担心这个了。=) - Jens
假设我们使用的是4.0版本,但目前我们仍在使用3.5版本。=) - Jim B
可能是Entity Framework .Include() with compile time checking?的重复问题。 - Craig Stuntz
1个回答

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

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

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


7
如果无法使用lambda表达式进行Include(),请添加using System.Data.Entity; - gronostaj
或者:使用 Microsoft.Data.Entity; - Cas Bloem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接