You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET MAUI中基于SQLite实现项目搜索功能?

项目搜索功能实现思路

根据你现有的MVVM框架下的RelayCommand代码,可以从本地过滤和后端查询两个方向实现按项目名称、ID搜索的功能,具体方案如下:

方案一:本地过滤(适合数据量较小的场景)

核心逻辑是先缓存全量项目数据,再在客户端根据搜索关键词做过滤,无需频繁请求后端。

实现步骤:

  1. 在ViewModel中新增私有集合,用于缓存从服务端获取的全部项目:
    private ObservableCollection<Project> _allProjects = new();
    public ObservableCollection<Project> Projects { get; } = new();
    
  2. 新增搜索关键词属性,绑定前端搜索输入框(使用CommunityToolkit.Mvvm可直接用[ObservableProperty]自动实现属性通知):
    [ObservableProperty]
    private string _searchKeyword = string.Empty;
    
  3. 修改原有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);
            }
        }
    }
    
  4. 新增搜索命令,根据关键词匹配项目名称(大小写不敏感)和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);
        }
    }
    
  5. 前端绑定:将搜索输入框的Text属性绑定到SearchKeyword,搜索按钮的Command绑定到SearchProjectsCommand;也可以在SearchKeyword属性变更时自动触发搜索(比如在属性setter中调用SearchProjects())。

方案二:后端查询(适合数据量较大的场景)

核心逻辑是将搜索逻辑放到后端,在数据库层面做过滤,减少前端传输的数据量,提升整体性能。

实现步骤:

  1. 修改后端服务的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();
    }
    
  2. 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);
            }
        }
    }
    
  3. 前端绑定逻辑同方案一,输入关键词后触发搜索命令即可。

额外优化点:

  • 如果项目ID是数字类型,可以尝试将搜索关键词转为数字后再匹配,避免字符串匹配的误差(比如用户输入"123"时,直接匹配ID=123的项目)。
  • 可以添加防抖逻辑,避免用户输入过程中频繁触发搜索(比如延迟500ms再执行搜索)。

内容的提问来源于stack exchange,提问作者Jeandré De Villiers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:54:20