如何通过复选框根据用户输入更改查询
本文关键字:输入 查询 用户 何通过 复选框 | 更新日期: 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);