GraphQL中DataLoader支持多键吗?Hot Chocolate GroupDataLoader疑问
Hot Chocolate GroupDataLoader 多键查询问题解答
1. 如何同时结合location与Type筛选条件?
通过复合键实现多条件筛选。将location和Type组合成一个可哈希的键类型(比如C#值元组、只读记录类),以此作为自定义GroupDataLoader的键类型,就能同时基于两个条件批量查询数据。
示例代码如下:
自定义复合键的GroupDataLoader:
public class LocationTypeGroupDataLoader : GroupDataLoader<(string Location, string Type), Location> { private readonly IDbContext _dbContext; public LocationTypeGroupDataLoader(IBatchScheduler batchScheduler, IDbContext dbContext) : base(batchScheduler) { _dbContext = dbContext; } protected override async Task<ILookup<(string Location, string Type), Location>> LoadGroupedBatchAsync( IReadOnlyList<(string Location, string Type)> keys, CancellationToken cancellationToken) { var locations = await _dbContext.Locations .Where(l => keys.Any(k => k.Location == l.Location && k.Type == l.Type)) .ToListAsync(cancellationToken); return locations.ToLookup(l => (l.Location, l.Type)); } }
在查询方法中使用:
public Task<List<Location>> GetLocationsAsync( string location, string type, LocationTypeGroupDataLoader dataLoader, CancellationToken cancellationToken) => dataLoader.LoadAsync((location, type), cancellationToken);
2. DataLoader是否支持这种多键查询?
Hot Chocolate的DataLoader(包括GroupDataLoader和BatchDataLoader)支持多键查询,但需要通过复合键的方式实现,而非直接传入多个独立参数。只要键类型满足可哈希、可比较相等性的要求(比如值元组、记录类型),就能作为DataLoader的键,实现多条件的批量加载。
3. 若不支持,最有效的替代方案是什么?是否需要弃用DataLoader,编写带筛选的常规数据库查询?
不需要弃用DataLoader,复合键方案就是最优解——既保留了DataLoader的批量加载、缓存特性,又能满足多条件筛选需求。
如果暂时不想自定义复合键DataLoader,也可以先通过单键GroupDataLoader加载同location的所有记录,再在内存中筛选Type=City的数据,但这种方式会加载冗余数据(比如示例中的额外10000条记录),性能较差,仅适合数据量极小的场景。
内容的提问来源于stack exchange,提问作者GThree
相关产品推荐
相关产品推荐

