0

嗨,我有一个选择和一个文本类型输入。这些控件用于过滤数据网格中的列表。选择控件具有以下选项:LastName、MiddleName、FirstName、Gender、City 和 StudentID。然后我收到了这个查询:

SELECT * FROM Student
WHERE ( LastName LIKE '%' + @LastName + '%' OR @LastName = '' )
AND ( MiddleName LIKE '%' + @MiddleName + '%' OR @MiddleName = '' )
AND ( FirstName LIKE '%' + @FirstName + '%' OR @FirstName = '' )
AND ( Gender LIKE '%' + @Gender + '%' OR @Gender = '' )
AND ( City LIKE '%' + @City + '%' OR @City = '' )
AND ( StudentID LIKE '%' + @StudentID + '%' OR @StudentID = '' )

例如,用户选择名字,然后输入“James”。这可以读作“给我名字是‘詹姆斯’的学生名单。” 在我的控制器中,我认为的唯一方法是使用 If..Else If 或 Switch 条件。是这样的:

string lastName = String.Empty;
string middleName = String.Empty;
and so on..

if(dropdown == "Lastname")
{
lastName = textbox_value;
}
else if(dropdown == "Middlename")
{
middleName = textbox_value;
}
and so on..

然后我有方法将值作为参数传递给我的 sql 查询。

resultList = GetRecord(lastName, middleName, firstName, gender, city, studentID);

我现在的问题是,有什么比使用 If..Else 和 Switch 更好、最干净、最简单的方法?

4

2 回答 2

2

您需要在某个地方决定它,或者在您的控制器中,或者您可以将它委托给另一个类,但将它委托给另一个帮助类将承担责任。所以我想说,你可能会想到下面的设计

 public class ParameterSelector
{


    private Dictionary<string,Action> _dictActionMap = new Dictionary<string, Action>();
    public ParameterSelector()
    {
        PopulateDictionaryWithActions();
    }

    private void PopulateDictionaryWithActions()
    {
        _dictActionMap.Add("LastName", () => lastName = txtBox_Value);
        _dictActionMap.Add("MiddleName", () => middleName = txtBox_Value);
    }
 }

和使用

main()
{
  if(_dictActionMap.ContainsKey(dropdown))
      _dictActionMap[_dictActionMap]();
}

为了避免ifs和switches,我使用了带有相关动作的字典,这种方法有其自身的缺点,例如,我们定义了一些不必要的动作来处理switch / ifs的部分,它给人一种我们已经摆脱了ifs / switch的感觉但是要权衡内存要求,因此永远不要使可以简单处理的事情复杂化。

所以我会说在你的情况下使用 Ifs/Switch 没有任何问题。

于 2013-03-22T06:12:19.040 回答
1

您可以查看使用switch(C# 参考)语句。

switch 语句是一个控制语句,它从候选列表中选择要执行的 switch 部分。

于 2013-03-22T06:05:36.413 回答