2008-11-03 22 views
4

我正在編寫一個內部應用程序,我們讓用戶執行幾種不同類型的查詢。如何將搜索項解析爲各種問題類型?

該應用程序允許用戶通過以下任一鍵搜索數據庫:

  • 僱員
  • 名(第一個或最後)
  • companyId
  • 狀態(workingFullTime,sickLeave,maternityLeave,等等)

蠻力的方法是簡單地爲每種類型的查詢做一個網絡表單,並有一個菜單,用戶選擇哪種類型的查詢來執行(這是ASP.NET)

但我想要的是有一個簡單的文本框,用戶輸入查詢,然後應用程序應該解析查詢並自動選擇發佈到後端的查詢類型。

例如,employeeId是一個精確格式的數字。所以我可以做一個正則表達式來匹配。公司Id等

所以我的問題是,如果任何人在這裏可以提供一些建議,如何在C#中最好的編碼方法,將需要一個字符串,並將其與一些不同的常規表達式。

乾杯, 喬金 -

+0

我認爲對於現狀,我想有一個選擇的形式,因爲它似乎只接受一定的價值觀。你爲什麼不顯示四個不同的輸入表單,並使用所有已填寫的表單,選擇用於查詢?這樣,你也可以進行組合查詢。 – Svante 2008-11-03 16:22:03

回答

1

的直接的方式將有if陳述依次測試每個正則表達式的序列:

if (Regex.Match(query, regex1)) { 
    HandleFirstCase(query); 
} else if(Regex.Match(query, regex2)) { 
    HandleSecondCase(query); 
} ... 
else { 
    HandleFullTextSearch(); 
} 

更復雜的方式將是一個數據驅動的方法,在表格中存儲正則表達式和動作並循環播放它們的地方:

public class RegexAction { 
    public Regex Pattern { get; private set; } 
    public Action<string> Handler { get; private set; } 
    public RegexAction(Regex pattern, Action<string> handler) { 
     this.Pattern = pattern; 
     this.Handler = handler; 
    } 
} 

public static RegexAction[] HandlerTable = new RegexAction[] { 
    new RegexAction(regex1, HandleFirstCase), 
    new RegexAction(regex2, HandleSecondCase), 
    new RegexAction(regex3, HandleThirdCase), 
    // ... 
} 

foreach(RegexAction action in HandlerTable) { 
    if (action.Match(query)) { 
     action.Handler(query); 
     break; 
    } 
} 

這有助於將imp從測試和調用的實施中提取數據,模式和行爲。

1

我會做的只是一個或查詢:

select * from employee where employeeId = search OR name like "%search%" OR status = "search"