如何利用多选下拉框组合值筛选数据源记录
解决多选下拉框筛选Farmers数据的问题
问题分析
原代码的核心问题是循环中每次直接覆盖result变量,导致多选时只有最后一个选中项的筛选生效;同时存在笔误(Logistics分支错误判断了ProductError)。我们需要动态叠加筛选条件,确保所有选中部门对应的Error字段都非空。
优化实现思路
- 将选中的下拉字符串转换为
DropdownEnum枚举集合,避免字符串硬编码判断 - 为每个选中的枚举项,添加对应的Error字段非空的筛选条件
- 一次性对数据源应用所有筛选条件,得到符合要求的结果
修改后的完整代码
internal class Program { static void Main(string[] args) { // 模拟用户选中的下拉值 string dropdownSelected = "1,2"; var result = new List<Farmers>(); // 1. 解析选中的下拉值为DropdownEnum集合 var selectedEnums = dropdownSelected.Split(',') .Select(s => (DropdownEnum)int.Parse(s)) .ToList(); // 2. 获取数据源(只调用一次,避免重复查询) var farmers = farmerList(); // 3. 动态构建筛选条件 IQueryable<Farmers> query = farmers.AsQueryable(); foreach (var selected in selectedEnums) { switch (selected) { case DropdownEnum.Production: query = query.Where(x => x.ProductError != null); break; case DropdownEnum.Shipping: query = query.Where(x => x.ShippingError != null); break; case DropdownEnum.Logistics: query = query.Where(x => x.LogisticError != null); break; } } // 4. 执行筛选得到结果 result = query.ToList(); // 输出结果验证(可选) foreach (var item in result) { Console.WriteLine($"ID: {item.ID}, Name: {item.Name}"); } } public static List<Farmers> farmerList() { List<Farmers> farmers = new List<Farmers> { new Farmers {ID = 1, Name = "Item1", ProductError = 1, ShippingError = 1, LogisticError = 2}, new Farmers {ID = 2, Name = "Item2", ProductError = null, ShippingError = 3, LogisticError = 2}, new Farmers {ID = 3, Name = "Item3", ProductError = null, ShippingError = null, LogisticError = null}, new Farmers {ID = 4, Name = "Item4", ProductError = null, ShippingError = null, LogisticError = null}, new Farmers {ID = 5, Name = "Item5", ProductError = 1, ShippingError = null, LogisticError = null}, new Farmers {ID = 6, Name = "Item6", ProductError = 1, ShippingError = null, LogisticError = null}, new Farmers {ID = 7, Name = "Item7", ProductError = 3, ShippingError = null, LogisticError =4}, new Farmers {ID = 8, Name = "Item8", ProductError = null, ShippingError = 5, LogisticError = 5} }; return farmers; } } public enum DropdownEnum { Production = 1, Shipping = 2, Logistics = 3, } public class Farmers { public int ID { get; set; } public string Name { get; set; } public string Location { get; set; } public double? LogisticError { get; set; } public int? ProductError { get; set; } public int? ShippingError { get; set; } }
关键改进点
- 避免重复查询数据源:只调用一次
farmerList(),提升性能 - 动态叠加筛选条件:通过
IQueryable逐步添加Where条件,确保所有选中项的判断都生效 - 类型安全的枚举解析:将字符串转换为枚举类型,减少硬编码错误
- 修正笔误:Logistics分支正确判断
LogisticError字段
效果验证
- 选中
1(Production):返回Item1、Item5、Item6、Item7 - 选中
1,2(Production+Shipping):只返回Item1(同时满足ProductError和ShippingError非空) - 选中
1,2,3:只返回Item1(三个Error字段都非空)
内容的提问来源于stack exchange,提问作者user3920526
相关产品推荐
相关产品推荐

