我想构建一个带有多个||的动态Linq Where子句(ORs),基于用户选中的复选框
我需要我的滤镜是|| s - 而不是&& s
示例:
车辆:汽车,SUV,卡车
颜色:黑色,蓝色,银色,白色
引擎:V4,V6,V8
var query = from v in vehicles
where
(v.Vehicle == "Car" && v.Color == "Blue")
|| (v.Vehicle == "Truck" && v.Engine == "V8")
|| (v.Vehicle == "Car" && v.Engine == "V4")
select v;
如何使用||创建/附加多个过滤器操作
我查看了ScottGu和PredicateBuilder ......但无法弄清楚如何让它工作
我还在学习Linq
答案 0 :(得分:1)
创建谓词数组。每个谓词检查特定条件:蓝色车,V8卡车或V4车等。管理阵列的内容并使用它如下:
delegate bool CheckVehicle(dynamic v); // predicate template
private static bool CheckCarBlue(dynamic v)
{
return v.Vehicle == "Car" && v.Color == "Blue";
}
private static bool CheckTruckV8(dynamic v)
{
return v.Vehicle == "Truck" && v.Engine == "V8";
}
private static bool CheckCarV4(dynamic v)
{
return v.Vehicle == "Car" && v.Engine == "V4";
}
代码中的某处:
List<CheckVehicle> checks = new List<CheckVehicle>();
checks.Add(CheckCarBlue);
checks.Add(CheckTruckV8);
checks.Add(CheckCarV4);
var Q = from v in vehicles
where checks.Any<CheckVehicle>(p => p(v))
select v;
答案 1 :(得分:0)
使用功能语法,可以使用以下两行来完成:
var CheckedColors = this.Controls.OfType<CheckBox>().Where(c => c.Checked).Select(c => c.Text).ToArray();
var CheckedVehicles = vehicles.Where(v => CheckedColors.Contains(v));
上面的代码假设您的复选框与您要查询的颜色具有相同的Text
。同样的逻辑也可以扩展到查询引擎类型。
Expalanation:第一行过滤表单上的所有复选框,然后创建每个选中的复选框的Text属性的投影。然后第二行过滤您列在该列表中的车辆。