如何在 EF Core 的 Hot Chocolate 中打开和关闭包含
How can you switch includes on and off in Hotchocolate for EFCore
所以我试图弄清楚如何根据来自客户端的 GraphQl 请求是否实际包含相关对象来告诉 EfCore 何时将包含应用于 IQueryable 对象。
示例:
2 类:人,付款
论文保存在 2 个不同的 table 和相关人员 -> 一对多关系中的付款
我设置了 1 个 GraphQl 查询来检索数据库中的所有人:
[UseFiltering]
[UseDbContext(typeof(DbAccess))]
public IQueryable<Person> GetPeople([ScopedService] DbAccess db)
{
return db.People;
}
这returns只是人员table中的字段
前任:
询问:
{people{sso,payments{amount, recipient{compayName}}}}
回复:
{
“数据”: {
“人们”: [
{
“sso”:“000-00-0003”,
“付款”:空
}
]
}
}
为了获得付款,我的 GetPeople 函数需要更改为
[UseFiltering]
[UseDbContext(typeof(DbAccess))]
public IQueryable<Person> GetPeople([ScopedService] DbAccess db)
{
return db.People.Include(p => p.Payments);
}
这行得通,但是当付款不是请求的一部分时会造成不必要的压力(因为 Include 每次都会 运行)。
我想做的是:
var baseQuery = db.People;
if (graphqlRequestIncludePayments)
{
baseQuery.Include(p => p.Payments);
}
return baseQuery;
但我不知道如何检查 GraphQl 查询以查看是否请求付款。我知道 GraphQl 会在返回给消费者之前删除多余的数据,但这可能会浪费服务器端的大量带宽和内存。
我觉得在 Hotchocolate ObjectType.Configure 函数中有一种方法可以做到这一点,但我看不到如何实现。
任何帮助将不胜感激,谢谢:)
Tobias Tengler 是正确的,这应该通过投影来完成
所以我试图弄清楚如何根据来自客户端的 GraphQl 请求是否实际包含相关对象来告诉 EfCore 何时将包含应用于 IQueryable 对象。
示例:
2 类:人,付款
论文保存在 2 个不同的 table 和相关人员 -> 一对多关系中的付款
我设置了 1 个 GraphQl 查询来检索数据库中的所有人:
[UseFiltering] [UseDbContext(typeof(DbAccess))] public IQueryable<Person> GetPeople([ScopedService] DbAccess db) { return db.People; }
这returns只是人员table中的字段 前任: 询问: {people{sso,payments{amount, recipient{compayName}}}} 回复: { “数据”: { “人们”: [ { “sso”:“000-00-0003”, “付款”:空 } ] } }
为了获得付款,我的 GetPeople 函数需要更改为
[UseFiltering] [UseDbContext(typeof(DbAccess))] public IQueryable<Person> GetPeople([ScopedService] DbAccess db) { return db.People.Include(p => p.Payments); }
这行得通,但是当付款不是请求的一部分时会造成不必要的压力(因为 Include 每次都会 运行)。
我想做的是:
var baseQuery = db.People;
if (graphqlRequestIncludePayments)
{
baseQuery.Include(p => p.Payments);
}
return baseQuery;
但我不知道如何检查 GraphQl 查询以查看是否请求付款。我知道 GraphQl 会在返回给消费者之前删除多余的数据,但这可能会浪费服务器端的大量带宽和内存。
我觉得在 Hotchocolate ObjectType.Configure 函数中有一种方法可以做到这一点,但我看不到如何实现。
任何帮助将不胜感激,谢谢:)
Tobias Tengler 是正确的,这应该通过投影来完成