我有一个名为 call 的数据库表,其中包含 call_time、location、emergency_type 列,紧急情况分为三种类型:护理人员、警察和消防员。在 Windows 窗体中,我创建了复选框“护理人员”、“警察”、“消防员”,我想检索所有符合用户选择的表格列。
我创建了一个函数:
public static DataTable GetHistory(DateTime from, DateTime to, bool paramedics, bool police, bool firefighters)
{
string select =
"SELECT call_time, location, emergency_type where call_time between @from AND @to AND";
if(paramedics)
{
select += " emergency_type = 'paramedics' ";
}
if(paramedics && police)
{
select +=" emergency_type = 'paramedics' OR emergency_type = 'police';
}
...
}
然而,这段代码看起来很脏,因为如果有 30 种紧急情况,那么就有 30 种!组合,我会在写所有 if 语句之前变老。
如果您可以分享您检索满足所选搜索条件的数据的实践,如果您可以选择很多选项,我将不胜感激。
谢谢!
最佳答案
好吧,如果您必须将 emergency_type 用作字符串,那么您可以发送一个包含紧急类型文本表示的列表,而不是传递 bool 值。例如,要调整上面的代码,您可以将方法签名更改为
public static DataTable GetHistory(DateTime from, DateTime to, List<string> types)
{
..
}
然后传入一个看起来像这样的列表(例如)
List<string> types =
new List<string> { "paramedics" };
or
List<string> types =
new List<string> { "paramedics", "police" };
然后您可以调整您的查询以在您的 where 子句中使用 SQL IN 语句。接下来将字符串列表转换为逗号分隔的字符串,如
string values = "'paramedics', 'police'"
创建值变量的一种简单方法是使用
string values = string.Empty;
types.ForEach(s =>
{
if (!string.IsNullOrEmpty(values))
values += ",";
values += string.Format("'{0}'", s);
});
顺便说一句,您可以使用参数化命令来避免 SQL 注入(inject)。一旦你有了字符串,你就可以简单地做
string select =
"SELECT call_time, location, emergency_type where call_time between @from AND @to AND emergency_type IN " + values
关于c# - 检索满足选定条件的数据的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/255642/