EF如何包含要查询的子对象

Posted

技术标签:

【中文标题】EF如何包含要查询的子对象【英文标题】:EF how to include subobject to query 【发布时间】:2014-02-08 14:56:04 【问题描述】:

我有两个表:用户和令牌,如下所示。

现在我使用 EF 编写查询,它采用 Token 对象,但 Token 对象中的子对象 User 为空。我应该如何修改我的查询以获取带有用户对象的令牌?

using (var db = new AccountDbContext())

    Token tok = db.Tokens
       .FirstOrDefault(p => tokenValue == p.Value) == 0);

    if (tok.User == null)
    
        //I'm there, but I 100% of sure thata this relation exists
        throw new Exception();
    

【问题讨论】:

您返回的对象应该具有user 对象,例如tokenObj.User!如果关系存在 @sarwar026:请看我更新的代码。 我明白了。但是不明白为什么是null如果有关系! 你可能会看到***.com/questions/21065177/…问题的答案 【参考方案1】:

实体框架不会自动将所有相关对象从数据库中加载出来——如果有很多表和很多关系,这可能会非常昂贵。您要么需要告诉 EF 在查询中加载关联的User(这称为急切加载),要么需要启用延迟加载,以便 EF 在首次访问时加载它。 (有关详细信息,请参阅 MSDN 文章 Loading Related Entities。

这是一个 Eager Loading 的示例(未彻底测试,因为我没有你的模型):

using (var db = new AccountDbContext())

    Token tok = db.Tokens.Include(n => n.User)
       .FirstOrDefault(p => tokenValue == p.Value) == 0);

【讨论】:

以上是关于EF如何包含要查询的子对象的主要内容,如果未能解决你的问题,请参考以下文章

EF:“包含”导航属性,当使用“选择”投影创建包装对象时

如何编写转换为 T-SQL 的 EF Core 查询包含

EF:包含 where 子句 [重复]

如何从 PostgreSQL 的子查询中选择包含值数组的列?

如何检查一个对象是不是至少包含一个键,其值包含 JavaScript 中的子字符串?

EntityFrameworkCore.Sqlite - 如何使用包含给定列表的所有项目的子列表查询实体?