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

ASP.NET MVC中如何根据选定的搜索条件查询数据库?

动态多条件搜索实现方案

看起来你已经搭好了基础的查询框架,现在只需要给它加上动态条件过滤的逻辑就行——核心思路很简单:只对用户实际选择/输入的有效参数应用过滤规则,空的或未选择的参数直接忽略。下面一步步帮你调整代码:

第一步:完善参数校验与处理

先把每个参数的有效性判断清楚:

  • Studies:下拉框未选择时可能传0或空字符串,我们只在它是有效正整数时才用它过滤
  • Country/Status:下拉框未选择时通常是空字符串,所以只在非空且不是默认占位选项(比如"请选择")时才触发过滤
  • Keyword:输入框为空时直接跳过

第二步:动态构建查询条件

因为IQueryable是延迟执行的,我们可以链式追加Where子句,只有参数有效时才添加对应的过滤逻辑。修改你的SearchController.cs代码如下:

public class SearchController : Controller 
{ 
    public ActionResult Index() 
    { 
        // 用using确保数据库上下文自动释放,避免资源泄漏
        using (var db = new DatabaseEntitiesModel())
        {
            // 1. 解析并处理请求参数
            int selectedStudies = 0;
            int.TryParse(Request.QueryString["Studies"], out selectedStudies);
            
            string selectedCountry = Request.QueryString["Country"]?.Trim();
            string selectedStatus = Request.QueryString["Status"]?.Trim();
            string keyword = Request.QueryString["Keyword"]?.Trim();

            // 2. 初始化基础查询
            IQueryable<Student> searchQuery = db.Students;

            // 3. 动态添加过滤条件
            // 过滤Studies:仅当选中有效ID时
            if (selectedStudies > 0)
            {
                searchQuery = searchQuery.Where(s => s.StudentStudiesID == selectedStudies);
            }

            // 过滤Country:仅当选中具体国家时
            if (!string.IsNullOrEmpty(selectedCountry))
            {
                // 忽略大小写匹配,可根据数据库规则调整
                searchQuery = searchQuery.Where(s => s.StudentCountry.Equals(selectedCountry, StringComparison.OrdinalIgnoreCase));
            }

            // 过滤Status:仅当选中具体状态时
            if (!string.IsNullOrEmpty(selectedStatus))
            {
                searchQuery = searchQuery.Where(s => s.StudentStatus.Equals(selectedStatus, StringComparison.OrdinalIgnoreCase));
            }

            // 过滤Keyword:支持多字段匹配(示例为姓名+城市,可按需修改)
            if (!string.IsNullOrEmpty(keyword))
            {
                searchQuery = searchQuery.Where(s => s.StudentName.Contains(keyword) 
                                                 || s.StudentCity.Contains(keyword));
            }

            // 4. 映射到ViewModel并排序返回
            List<SearchViewModel> searchResults = searchQuery
                .Select(x => new SearchViewModel 
                { 
                    StudentID = x.StudentID, 
                    StudentName = x.StudentName, 
                    StudentCountry = x.StudentCountry, 
                    StudentCity = x.StudentCity, 
                    StudiesName = x.Study.StudiesName, 
                    StudentStatus = x.StudentStatus 
                })
                .OrderByDescending(x => x.StudentID)
                .ToList();

            return View(searchResults);
        }
    } 
}

额外实用提示

  • 大小写匹配:代码里用了StringComparison.OrdinalIgnoreCase忽略大小写,如果你的数据库是区分大小写的排序规则,可以去掉这个参数
  • SQL注入安全:这里用IQueryable会自动生成参数化SQL,完全不用担心注入问题
  • 视图回显:如果需要在页面上保留用户的搜索选项(比如下拉框保持选中状态),可以把参数传到ViewBag里,比如ViewBag.SelectedStudies = selectedStudies;,再在视图的下拉框中设置对应选中属性

内容的提问来源于stack exchange,提问作者Covert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:46:03