访问 Hot Chocolate GraphQL 过滤器值以转换为 Odata 过滤器

问题描述 投票:0回答:0

概览

我在不同的项目中有几个 GraphQL 端点,其中大部分使用 Entity Framework。 我们混合了 HC 10 和 HC 12 项目。在这些中,我们使用 HC 过滤并且效果很好——GraphQL 查询自然地转换为 SQL 查询。投影/选择也很好用 - 不会过度获取行或列。

问题

我有一个端点,虽然它不使用 EF,而是使用他们的 .NET SDK 与 MS Graph 对话 (

Microsoft.Graph.GraphServiceClient
)。假设我的端点是从我们的实例中检索用户。之前的写法是这样的:

[UseFiltering]
[UseSorting]
[Authorize]
public async Task<IEnumerable<Employee>> GetEmployees([Service] IMicrosoftDirectoryService directoryService)
    => (await directoryService.GetUsers()); 

这里是

GetUsers
实现 - 它从 MS 抓住了每个用户。

public async Task<IEnumerable<User>> GetUsers(string filter = null)
{
    var users = new List<Microsoft.Graph.User>();
    var page = _client.Users.Request();
    

    if (!string.IsNullOrWhiteSpace(filter))
    {
        _ = page.Filter(filter);
    }

    while (page != null)
    {
        var result = await page.GetAsync();
        users.AddRange(result.CurrentPage);
        page = result.NextPageRequest;
    }

    return users;
}

所以现在发生的事情是,如果我想..按职位过滤,我的结果集是正确的——但是我们获取了每个用户,然后 HC 在内存中过滤掉了.. 顺便说一句,这是我的查询:

{
    employees(where: { jobTitle: "Stackoverflow fiend" }) {
        displayName
        employeeNumber
        jobTitle
    }
}

我想不通的..

我已经查看了 HC 10-11-12 的大量示例和文档,但找不到将 HC 过滤器转换为 Microsoft 可以理解的东西(odata 过滤器)的优雅方法。

现在这是我所做的更改……只是很乱。 这是查询解析器 - 我正在尝试从 HC 的实现中“构建一个 odata 过滤器”..

[UseFiltering(FilterType = typeof(EmployeeFilterType))]
[UseSorting]
[Authorize]
public async Task<IEnumerable<Employee>> GetEmployees(
    [Service] IMicrosoftDirectoryService directoryService,
    [Service] IResolverContext resolverContext)
{
    // todo - custom filter?  this is messy..
    // anyway.. this is a list of all our WHERE conditions..
    var whereFilter = resolverContext.FieldSelection.Arguments.FirstOrDefault(a => a.Name.Value.ToLower() == "where");
    string filterString = null;

    if (whereFilter is not null)
    {
        var jobTitleFilter = ((List<HotChocolate.Language.ObjectFieldNode>)whereFilter.Value.Value)
            .FirstOrDefault(f => f.Name.Value == "jobTitle");
        if (jobTitleFilter is not null)
        {
            // this makes a string like "jobTitle eq 'foobar'"
            filterString = $"{jobTitleFilter.Name} eq '{jobTitleFilter.Value}'";
        }
    }

    return await directoryService.GetUsers(filterString);
}

有人处理过与 EF 无关的过滤或投影吗?我正在尝试找到正确的方式来询问 HC“他们要求或过滤什么”或天上掉馅饼 存在可以为我翻译这些的东西<3

c# .net graphql odata hotchocolate
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.