【发布时间】:2022-01-10 23:06:13
【问题描述】:
如果我不希望我的服务返回 IQueryable,有没有办法使用预测?
我正在考虑类似的事情,我的解析器可以将输入映射到表达式,然后调用服务类,然后根据提供的表达式构建和执行查询,转换为一些只读集合并返回给用户。
类似于以下内容:
public async Task<IReadOnlyList<TestPayload>> GetAllTests(
[Service] ITestService,
CancellationToken cancellationToken,
object[] requestedFields) =>
await service.GetAllAsync(requestedFields, cancellationToken);
然后为我服务:
var expression = BuildExpression(requestedFields);
var output = testRepository.Queryable()
.Select(expression)
.AsNoTracking();
return output.ToListAsync();
你能告诉我一些关于这个的方向吗?
编辑:
根据@Pascal 的回答,我在 IQueryable 上添加了 HotChocolate.Data 包并调用了 Project(context) 扩展方法。
现在我的有效负载(模型)类有问题,但我不太确定原因。
以下示例将返回所有列并且不会应用投影。
[UseProjection]
public async Task<IReadOnlyList<TestPayload>> TestGetAll([Service] ITestService testService, IResolverContext context, CancellationToken cancellationToken)
{
return await testService.GetAllAsync(context, cancellationToken);
}
这个会起作用,并且会投射到查询中并只返回请求的内容。请注意,唯一不同的是返回类型(IReadOnly 而不是 IReadOnly)。
[UseProjection]
public async Task<IReadOnlyList<Test>> TestGetAll([Service] ITestService testService, IResolverContext context, CancellationToken cancellationToken)
{
return await testService.GetAllAsync(context, cancellationToken);
}
服务内部:
var tests = testRepository.Queryable()
.Project<Test>(context)
.AsNoTracking();
我猜这是因为解析器现在正在使用 dto TestPayload 类型,然后在服务内部尝试投影到实体(测试)的 IQueryable,但我不确定如何克服它。
【问题讨论】:
-
这方面有什么更新吗?
标签: c# entity-framework asp.net-core graphql hotchocolate