在将经典ASP应用程序转换为C#.NET时,我最近遇到了一个相当有趣的问题。在此MVC应用程序中,前端复选框(下方)作为字符串读入,可以是多种组合。 C#case语句确定正确的组合,并将case语句中的SQL语句连接到数据层文件中的SELECT。
<input value="A" type="checkbox" class="material-checkbox"
id="" name="checkbox" checked />
<input value="B" type="checkbox" class="material-checkbox"
id="" name="checkbox" />
<input value="C" type="checkbox" class="material-checkbox"
id="" name="checkbox" />
<input value="D" type="checkbox" class="material-checkbox"
id="" name="checkbox" />
试试这个:
有多种方法可以做到这一点:ABCD的组合可以创建总共15种组合。我在交换机案例中创建了所有15种组合:
string checkboxvalue = "";
if(chkA.Checked()) checkboxvalue +="A";
if(chkB.Checked()) checkboxvalue +="B";
if(chkC.Checked()) checkboxvalue +="C";
if(chkD.Checked()) checkboxvalue +="D";
switch(checkboxvalue)
{
case "ABCD":
strSql += "AND .....;"
break;
case "ABC":
strSql += "AND .....;"
break;
case "ABD":
strSql += "AND .....;"
break;
case "ACD":
strSql += "AND .....;"
break;
case "BCD":
strSql += "AND .....;"
break;
case "AB":
strSql += "AND .....;"
break;
case "AC":
strSql += "AND .....;"
break;
case "AD":
strSql += "AND .....;"
break;
case "BC":
strSql += "AND .....;"
break;
case "BD":
strSql += "AND .....;"
break;
case "CD":
strSql += "AND .....;"
break;
case "A":
strSql += "AND .....;"
break;
case "B":
strSql += "AND .....;"
break;
case "C":
strSql += "AND .....;"
break;
case "D":
strSql += "AND .....;"
break;
}
我假设您可能正在尝试根据要检查的复选框选项构建where子句条件。在这里,如果我们尝试使用switch语句,我们可能最终会为每个组合编写大量的案例,这些案例效率不高(例如-a,ab,abc,abcd,ac,acd,ad,b ,bc,bcd,bd,c,cd,d)。如果值不是为了组合将成倍增加。更糟。因此,如果使用带有字符串构建器的简单条件语句来保存最终字符串,那将是有益的 -
StringBuilder sb = new StringBuilder();
if (checkbox1.checked)
{
sb.Apppend("Condition1");
}
if (checkbox2.checked)
{
sb.Apppend("Condition2");
}
if (checkbox3.checked)
{
sb.Apppend("Condition3");
}
if (checkbox4.checked)
{
sb.Apppend("Condition4");
}
假设用户选择了框A,C,D。
strSql += "SELECT column1, column2, ...
FROM table_name;"
switch(checkboxvalue)
{
case (("ABCD")): //<---Contains "ACD" but not "B" NO MATCH
strSql += "AND .....;"
break;
case (("ABC")): //<---- Contains "A" but not "BC" NO MATCH
strSql += "AND.......;"
break;
case (("AB")): //<--Contains "A" but no "B" NO MATCH
strSql += "AND......;"
break;
case (("AC")): //<--Contains "AC" but no "D" NO MATCH
strSql += "AND.....";
break;
case (("ACD")): //<--MATCH!
strSql += "AND......"; //<--add to select to pull correct data
break;
}
由于你基本上是比较布尔值,我建议制作一个表来映射你所拥有的不同复选框组合,以便验证你是否更好地使用if-elses或者更少嵌套if而不是switch。尝试重新确定您将拥有多少输出以及在这种情况下您需要执行哪些操作。
static void executeSQL(string checkboxes)
{
switches checkbox_switches = new switches(checkboxes.Contains('A'), checkboxes.Contains('B'), checkboxes.Contains('C'), checkboxes.Contains('D'));
if (checkbox_switches.action_A)
{
//Execute SQL
}
else if (checkbox_switches.action_B)
{
//Execute SQL
}
else if (checkbox_switches.action_C)
{
//Execute SQL
}
else if (checkbox_switches.action_D)
{
//Execute SQL
}
else if (checkbox_switches.action_E)
{
//Execute SQL
}
}
struct switches
{
public bool action_A, action_B, action_C, action_D, action_E;
public switches(bool A, bool B, bool C, bool D)
{
action_A = A && B;
action_B = B || D;
action_C = C && D;
action_D = action_A && C;
action_E = !A && !B && !C && D;
}
}