如何通过复选框根据用户输入更改查询

本文关键字:输入 查询 用户 何通过 复选框 | 更新日期: 2023-09-27 18:33:55

这是我的代码:

var query = from x in Data
select new { Fruit = x[0], Animal, x[2], Color = x[3], Food = x[4] };

现在,我想创建复选框,以便如果用户选中"框 1",它将执行不同的查询,如下所示:

select new { Fruit = x[7], Animal, x[4], Color = x[8], Food = x[9] };

我的问题是,我如何使它根据选中的复选框使用不同的select...new语句

我想我可以使用多个 if/then 语句来查看选中了哪个特定框并确定要使用哪个 select...new 语句,但我猜那里有更好的方法。

在 VB 中,我认为"case"语句会发挥作用,但我不知道什么是 C# 等价物。

我在更改查询参数的上下文中实现 case/switch 的尝试失败:

int caseSwitch = 1;
var query = from x in Data
switch (caseSwitch)
{
       case 1:
           select new { Fruit = x[0], Animal, x[2], Color = x[3], Food = x[4] };
           break;
       case 2:
           select new { Fruit = x[7], Animal, x[4], Color = x[8], Food = x[9] };
           break;
}

如何通过复选框根据用户输入更改查询

为了改变查询,您可以使用switch语句。 但是,这样做不能使用匿名类型。 您需要定义一个可以使用的对象,以便在声明时可以定义查询对象。

public class Foo
{
    public string Fruit { get; set; }
    public string Animal { get; set; }
    public string Color { get; set; }
    public string Food { get; set; }
}
IEnumerable<Foo> query = null;
switch (caseSwitch)
{
    case 1:
        query = from x in Data
                select new Foo { Fruit = x[0], Animal = x[2], Color = x[3], 
                    Food = x[4] };
         break;
     case 2:
         query = from x in Data
                select new Foo { Fruit = x[7], Animal = x[4], Color = x[8],
                    Food = x[9] };
         break;
     default:
         // handle however you need to
}

您也可以将其完全内联到 LINQ 查询中,但是,如果针对多种情况扩展代码,将使代码更难理解和维护。

var query = from x in Data
            // needed to get the caseSwitch value into context in the select
            //  otherwise it is considered out of context
            let sw = caseSwitch  
            select sw == 1 ?
                new { Fruit = x[0], Animal = x[2], Color = x[3], Food = x[4] } :
                new { Fruit = x[7], Animal = x[4], Color = x[8], Food = x[9] }

这种方法的问题在于,当caseSwitch超出有效值范围时,您可能会得到一个您不想要的值。 最好使用 switch 语句来处理此问题,您可以在其中将查询设置为默认值或在达到default情况时引发异常。

具有两个以上事例的内联 LINQ 的示例

var query = from x in Data
            let sw = caseSwitch  
            select 
                sw == 1 ? new { Fruit = x[0], Animal = x[2], Color = x[3], Food = x[4] }
                : sw == 2 ? new { Fruit = x[7], Animal = x[4], Color = x[8], Food = x[9] }
                : sw == 3 ? new { Fruit = x[10], Animal = x[11], Color = x[12], Food = x[13] }
                : null; // final value is the default value

您可以将选择项分解为一个函数:

function object getItem(DataItem x, int caseSwitch)
{
    switch (caseSwitch)
    {
       case 1:
           return new { Fruit = x[0], Animal, x[2], Color = x[3], Food = x[4] };
           break;
       case 2:
           return new { Fruit = x[7], Animal, x[4], Color = x[8], Food = x[9] };
           break;
    }
}

然后,您可以执行以下查询:

int caseSwitch = 1;
var query = from x in Data
            select getItem(x, caseSwitch);