如何在.NET MAUI中基于SQLite实现项目搜索功能?
项目搜索功能实现思路
根据你现有的MVVM框架下的RelayCommand代码,可以从本地过滤和后端查询两个方向实现按项目名称、ID搜索的功能,具体方案如下:
方案一:本地过滤(适合数据量较小的场景)
核心逻辑是先缓存全量项目数据,再在客户端根据搜索关键词做过滤,无需频繁请求后端。
实现步骤:
- 在ViewModel中新增私有集合,用于缓存从服务端获取的全部项目:
private ObservableCollection<Project> _allProjects = new(); public ObservableCollection<Project> Projects { get; } = new(); - 新增搜索关键词属性,绑定前端搜索输入框(使用CommunityToolkit.Mvvm可直接用
[ObservableProperty]自动实现属性通知):[ObservableProperty] private string _searchKeyword = string.Empty; - 修改原有
GetProjectList命令,将获取到的项目同时存入缓存集合:[RelayCommand] public async void GetProjectList() { Projects.Clear(); _allProjects.Clear(); var projectList = await _projectService.GetProjectList(); if (projectList?.Count > 0) { foreach (var project in projectList) { _allProjects.Add(project); Projects.Add(project); } } } - 新增搜索命令,根据关键词匹配项目名称(大小写不敏感)和ID:
[RelayCommand] public void SearchProjects() { Projects.Clear(); IEnumerable<Project> filteredProjects = _allProjects; if (!string.IsNullOrWhiteSpace(SearchKeyword)) { filteredProjects = _allProjects.Where(p => p.Name.Contains(SearchKeyword, StringComparison.OrdinalIgnoreCase) || p.Id.ToString().Contains(SearchKeyword)); } foreach (var project in filteredProjects) { Projects.Add(project); } } - 前端绑定:将搜索输入框的
Text属性绑定到SearchKeyword,搜索按钮的Command绑定到SearchProjectsCommand;也可以在SearchKeyword属性变更时自动触发搜索(比如在属性setter中调用SearchProjects())。
方案二:后端查询(适合数据量较大的场景)
核心逻辑是将搜索逻辑放到后端,在数据库层面做过滤,减少前端传输的数据量,提升整体性能。
实现步骤:
- 修改后端服务的
GetProjectList方法,新增搜索参数并添加数据库过滤逻辑(以EF Core为例):public async Task<List<Project>> GetProjectList(string searchKeyword = null) { var query = _dbContext.Projects.AsQueryable(); if (!string.IsNullOrWhiteSpace(searchKeyword)) { // 同时匹配项目名称和ID query = query.Where(p => p.Name.Contains(searchKeyword, StringComparison.OrdinalIgnoreCase) || p.Id.ToString().Contains(searchKeyword)); } return await query.ToListAsync(); } - ViewModel中新增搜索关键词属性和搜索命令,直接调用带参数的后端接口:
[ObservableProperty] private string _searchKeyword = string.Empty; [RelayCommand] public async void SearchProjects() { Projects.Clear(); var projectList = await _projectService.GetProjectList(SearchKeyword); if (projectList?.Count > 0) { foreach (var project in projectList) { Projects.Add(project); } } } - 前端绑定逻辑同方案一,输入关键词后触发搜索命令即可。
额外优化点:
- 如果项目ID是数字类型,可以尝试将搜索关键词转为数字后再匹配,避免字符串匹配的误差(比如用户输入"123"时,直接匹配ID=123的项目)。
- 可以添加防抖逻辑,避免用户输入过程中频繁触发搜索(比如延迟500ms再执行搜索)。
内容的提问来源于stack exchange,提问作者Jeandré De Villiers
相关产品推荐
相关产品推荐

