ASP.NET Core MVC中基于MySQL的多字段搜索与过滤实现
ASP.NET Core MVC中基于多过滤字段的搜索方法
我来帮你搞定这个多过滤字段的搜索功能!首先明确你的需求:在Visual Studio 2017的ASP.NET Core MVC项目中,对MySQL数据库的数据进行基础搜索后,再通过category、modules、Keywords等多个过滤器组合筛选结果。
你的模型类
先确认下你的CompanyRecords模型:
namespace i.model { public class CompanyRecords { public int? id { get; set; } public int? user_id { get; set; } public string product_name { get; set; } public string Keywords { get; set; } public string category { get; set; } public string description { get; set; } public string modules { get; set; } } }
当前代码的核心问题
你的现有代码已经能实现基础模糊搜索,但存在两个关键问题:
- SQL注入风险:直接拼接用户输入到SQL语句中,这是非常危险的做法,容易被攻击者利用。
- 过滤逻辑不灵活:硬编码的
if-else只能处理单一过滤器,无法支持多个过滤器同时生效(比如同时按category和modules筛选),而且你尝试用Linq直接传给conn.Query的写法是错误的(conn.Query需要SQL语句,不能直接传入内存中的Linq结果)。
改进后的实现方案
下面是优化后的代码,既解决了SQL注入问题,又支持多过滤器组合筛选:
1. 数据库层面动态过滤(推荐方案)
所有过滤逻辑在数据库端执行,性能更高,适合大数据量场景:
public List<CompanyRecords> GetProducts(string searchTerm, SearchModel searchFilters) { using (MySqlConnection conn = GetConnection()) { conn.Open(); // 基础搜索条件:匹配多个字段的模糊搜索 string sql = @"SELECT * FROM product WHERE (category LIKE @SearchTerm OR Keywords LIKE @SearchTerm OR product_name LIKE @SearchTerm OR description LIKE @SearchTerm OR modules LIKE @SearchTerm OR metatags LIKE @SearchTerm OR geographical_focus LIKE @SearchTerm)"; // 准备参数,彻底避免SQL注入 var parameters = new Dictionary<string, object> { { "@SearchTerm", $"%{searchTerm}%" } }; // 动态追加category过滤器 if (!string.IsNullOrEmpty(searchFilters.category)) { sql += " AND category LIKE @Category"; parameters.Add("@Category", $"%{searchFilters.category}%"); } // 动态追加modules过滤器 if (!string.IsNullOrEmpty(searchFilters.modules)) { sql += " AND modules LIKE @Modules"; parameters.Add("@Modules", $"%{searchFilters.modules}%"); } // 动态追加Keywords过滤器 if (!string.IsNullOrEmpty(searchFilters.Keywords)) { sql += " AND Keywords LIKE @Keywords"; parameters.Add("@Keywords", $"%{searchFilters.Keywords}%"); } // 执行查询并返回结果 return conn.Query<CompanyRecords>(sql, parameters).ToList(); } }
2. 关键优化点说明
- 参数化查询:所有用户输入都通过参数传递,彻底规避SQL注入风险。
- 动态条件构建:根据
SearchModel中不为空的过滤器属性,动态追加AND条件,支持任意组合的多过滤筛选。 - 数据库端过滤:相比内存过滤,数据库端过滤能利用索引,处理大数据量时性能优势明显。
3. 内存层面过滤(备选方案)
如果数据量较小,或者需要先获取全量基础结果再做内存筛选,可以用这种方式:
public List<CompanyRecords> GetProducts(string searchTerm, SearchModel searchFilters) { using (MySqlConnection conn = GetConnection()) { conn.Open(); // 先获取基础搜索结果 string baseSql = @"SELECT * FROM product WHERE category LIKE @SearchTerm OR Keywords LIKE @SearchTerm OR product_name LIKE @SearchTerm OR description LIKE @SearchTerm OR modules LIKE @SearchTerm OR metatags LIKE @SearchTerm OR geographical_focus LIKE @SearchTerm"; var parameters = new { SearchTerm = $"%{searchTerm}%" }; List<CompanyRecords> results = conn.Query<CompanyRecords>(baseSql, parameters).ToList(); // 应用category过滤器 if (!string.IsNullOrEmpty(searchFilters.category)) { results = results.Where(x => x.category?.Contains(searchFilters.category) == true).ToList(); } // 应用modules过滤器 if (!string.IsNullOrEmpty(searchFilters.modules)) { results = results.Where(x => x.modules?.Contains(searchFilters.modules) == true).ToList(); } // 应用Keywords过滤器 if (!string.IsNullOrEmpty(searchFilters.Keywords)) { results = results.Where(x => x.Keywords?.Contains(searchFilters.Keywords) == true).ToList(); } return results; } }
内容的提问来源于stack exchange,提问作者user9539656
相关产品推荐
相关产品推荐

