我在不同的项目中有几个 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