从复选框中构建动态linq

时间:2015-01-17 07:15:24

标签: c# linq

我想构建一个带有多个||的动态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

2 个答案:

答案 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属性的投影。然后第二行过滤您列在该列表中的车辆。