如何筛选CollectionView数据表中满足指定条件的特定行
实现方法
你当前用的是sqlite-net异步查询语法,要实现CollectionView只展示Number等于指定值的行,直接在数据库查询层加过滤条件即可,不需要拉取全量数据到内存后再筛选,性能更好。
单表筛选(匹配表1主键Number)
给查询方法传入目标匹配值,在ToListAsync()前追加Where条件,筛选逻辑会直接翻译成SQL在数据库端执行:
// 传入需要匹配的Number值,若Number是int/long类型请将参数类型替换为对应数值类型 public async Task<List<DB_PosteNF>> ListerPF(string targetNumber) { try { return await connection.Table<DB_PosteNF>() .Where(row => row.Number == targetNumber) .ToListAsync(); } catch (Exception ex) { StatutMessage = $"Impossible d'afficher la liste des postes de frais. \nErreur : {ex.Message}"; } return new List<DB_PosteNF>(); }
调用时传入你需要匹配的xx值,拿到的结果直接绑定给CollectionView的ItemsSource就只会展示符合条件的行。
两表关联筛选(主键/外键Number匹配)
你提到的两张表关联逻辑:表1主键为Number,表2主键为Id、外键Number关联表1,分两种常见场景处理:
- 如果CollectionView绑定展示的是表2数据,直接对表2的实体集合加外键筛选即可,假设表2对应实体类为
DB_RelatedInfo:
public async Task<List<DB_RelatedInfo>> ListerRelatedRows(string targetNumber) { try { return await connection.Table<DB_RelatedInfo>() .Where(row => row.Number == targetNumber) .ToListAsync(); } catch (Exception ex) { StatutMessage = $"查询关联数据失败,错误信息:{ex.Message}"; } return new List<DB_RelatedInfo>(); }
- 如果需要同时获取表1主数据和表2关联的所有行,分两次查询即可,sqlite-net不支持原生JOIN映射实体,分开查询逻辑简单且性能足够:
public async Task<(DB_PosteNF mainRow, List<DB_RelatedInfo> relatedRows)> GetMatchedData(string targetNumber) { try { // 先查表1匹配Number的主记录 var mainData = await connection.Table<DB_PosteNF>() .FirstOrDefaultAsync(row => row.Number == targetNumber); if (mainData == null) return (null, new List<DB_RelatedInfo>()); // 再查表2所有外键匹配的关联记录 var relatedData = await connection.Table<DB_RelatedInfo>() .Where(row => row.Number == targetNumber) .ToListAsync(); return (mainData, relatedData); } catch (Exception ex) { StatutMessage = $"查询关联数据失败,错误信息:{ex.Message}"; } return (null, new List<DB_RelatedInfo>()); }
注意:不要调用无筛选的
ToListAsync()拉取全表数据到内存后再过滤,数据量较大时会造成内存占用高、查询慢的问题,把筛选条件写在ToListAsync()前会自动生成带WHERE子句的SQL,走数据库索引查询效率更高。
内容的提问来源于stack exchange,提问作者Olivia
相关产品推荐
相关产品推荐

