如何在 EF Core 的 Hot Chocolate 中打开和关闭包含

Posted

技术标签:

【中文标题】如何在 EF Core 的 Hot Chocolate 中打开和关闭包含【英文标题】:How can you switch includes on and off in Hotchocolate for EFCore 【发布时间】:2022-01-19 20:01:37 【问题描述】:

所以我试图根据来自客户端的 GraphQl 请求是否实际包含相关对象来告诉 EfCore 何时将包含应用于 IQueryable 对象。

例子:

2 类:人员、付款

论文保存在 2 个不同的表和相关人员中 -> 以一对多关系付款

我设置了 1 个 GraphQl 查询来检索数据库中的所有人:

 [UseFiltering]
 [UseDbContext(typeof(DbAccess))]
 public IQueryable<Person> GetPeople([ScopedService] DbAccess db)
 
     return db.People;
 

这仅返回 People 表中的字段 前任: 询问: peoplesso,paymentsamount,收件人compayName 回复: “数据”: “人们”: [ "sso": "000-00-0003", “付款”:空 ]

为了获得付款,我的 GetPeople 函数需要更改为

 [UseFiltering]
 [UseDbContext(typeof(DbAccess))]
 public IQueryable<Person> GetPeople([ScopedService] DbAccess db)
 
     return db.People.Include(p => p.Payments);
 

这可行,但当付款不是请求的一部分时会造成不必要的压力(因为每次都会运行包含)。

我想做的是这样的:

    var baseQuery = db.People;
        if (graphqlRequestIncludePayments)
        
            baseQuery.Include(p => p.Payments);
        
    return baseQuery;

但我不知道如何检查 GraphQl 查询以查看是否请求付款。我知道 GraphQl 会在返回给消费者之前删除多余的数据,但这可能会浪费服务器端的大量带宽和内存。

我觉得在 Hotchocolate ObjectType.Configure 函数中有一种方法可以做到这一点,但我看不出怎么做。

任何帮助将不胜感激,谢谢:)

【问题讨论】:

我认为您正在寻找预测:chillicream.com/docs/hotchocolate/fetching-data/projections 我认为您是完全正确的 Tobias,尽管它似乎对我不起作用。我尝试添加投影,但仍会拉出额外的字段,并且不会拉出相关字段。根据文档,它看起来确实像 Projections 应该解决问题:/ 【参考方案1】:

Tobias Tengler 是正确的,这应该通过投影来完成

【讨论】:

没有答案。实际的解决方案是什么?你做了什么?如果你花了一周的时间才清楚地解决问题,那不是仅仅通过查看文档就能解决的问题 它确实回答了这个问题。我花了一周的时间来分享最终答案,因为我在预测中有 1 个小问题(属性排序)导致我的代码在一段时间内失败。但这与这个问题无关。我也不仅仅是在解决这个问题,所以花了一些时间来完成它以确保预测是我想要做的事情的正确答案。

以上是关于如何在 EF Core 的 Hot Chocolate 中打开和关闭包含的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EF.core 中使用 FromSqlRaw 指定列

如何在 EF Core 中使用 DbFunction 翻译?

如何在 EF Core 中配置固定长度的列?

如何使用 EF Core 在 ASP.NET Core 中取消应用迁移

如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?

如何在 EF Core 中调用 ThenInclude 两次?