如何使用Isar Link结合QueryGroup实现餐厅多条件过滤?
解决方案
1. 更新QueryGroup类,支持多地点过滤条件
首先修改你的QueryGroup类,用地点ID列表替代原来的单个地点ID字段,用来存储需要筛选的多个地点:
class QueryGroup { final String? nameKeyword; // 替换单个locationId为多地点ID列表 final List<int>? locationIds; QueryGroup({ this.nameKeyword, this.locationIds, }); }
2. 修改searchRestaurantsWithQueryGroup方法实现多地点OR过滤
利用Isar数据库原生的anyOf方法,就能快速实现「多地点任意匹配」的OR逻辑,同时保留餐厅名称的模糊搜索条件:
Future<List<Restaurant>> searchRestaurantsWithQueryGroup(Isar isar, QueryGroup queryGroup) async { final query = isar.restaurants.filter(); // 处理餐厅名称模糊匹配(包含指定字符串) if (queryGroup.nameKeyword != null && queryGroup.nameKeyword!.isNotEmpty) { query.nameContains(queryGroup.nameKeyword!, caseSensitive: false); } // 处理多地点OR过滤(属于任意指定地点) if (queryGroup.locationIds != null && queryGroup.locationIds!.isNotEmpty) { query.locationIdAnyOf(queryGroup.locationIds!); } return await query.findAll(); }
补充说明
- 如果你的
Restaurant模型是通过关联对象(而非直接存储locationId)关联Location,可以改用关联查询的anyOf方法,比如:query.location((loc) => loc.nameAnyOf(queryGroup.locationNames!)); - 边界兼容:当
locationIds为空或长度为0时,会自动跳过地点过滤,和原有逻辑完全兼容;当列表只有一个ID时,效果和原来的单个地点过滤一致。 - Isar的
anyOf方法是原生优化的OR逻辑实现,性能比手动拼接多个or条件更好,优先推荐使用。
内容的提问来源于stack exchange,提问作者extxuser
相关产品推荐
相关产品推荐

