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

Posted

技术标签:

【中文标题】Linq to Entities - 使用 Include() 急切加载【英文标题】:Linq to Entities - eager loading using Include() 【发布时间】:2011-03-12 06:57:34 【问题描述】:

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

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

现在,使用上面的 sn-p;我被困在如何深入到答案表上。知道我可以为这个表达式使用什么 lambda 表达式吗?

【问题讨论】:

据我所知,.NET 4.0 中的 Linq to Entities 确实支持延迟加载(默认启用)。那时你不需要为此烦恼。 =) 假设我们使用的是 4.0.我们暂时还在使用 3.5 =) Entity Framework .Include() with compile time checking? 的可能重复项 【参考方案1】:

好的;在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”,它将预先加载所有问题的答案。

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

【讨论】:

如果您不能将 Include() 与 lambda 表达式一起使用,请添加 using System.Data.Entity;。 (src) 或:using Microsoft.Data.Entity;

以上是关于Linq to Entities - 使用 Include() 急切加载的主要内容,如果未能解决你的问题,请参考以下文章

在 LINQ to Entities 中批量删除

LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”

如果存在-UPDATE-else-INSERT 与 Linq-to-Entities?

LINQ to Entities 无法识别方法“布尔包含 [Int32]

如何使用 LINQ to Entities 获取字节数组长度?

在实体框架和 Linq to Entities 中使用规范模式和表达式