2011-08-01 84 views
0

我正在尋找一種方法來建立一個內部搜索引擎,根據標準來搜索交易。 我的問題是更多的標準意味着更多的檢查..所以如果有6個標準..我幾乎必須在IF語句中做6 x 6 = 36 ELSE。那巨大..我非常確定有一些其他方式來做到這一點。如何構建內部搜索引擎?

解釋:如果我有一個對象,有A,B,C,d,E,F,我必須檢查是否

A,B,C,D,E NOT F 
A,B,C,D, NOT E, F 
A,B,C, NOT D, E, F 
etc.. 

所以,我怎麼能處理呢? (我正在用WPF使用C#)

編輯:這裏有更多的細節。

  • 這是代碼而不是SQL。
  • 必須評估的標準數取決於用戶。

感謝。

+0

你能發佈一些更多的細節,比如你有什麼樣的標準嗎?他們如何指定給搜索引擎等。這會讓答案更容易。 –

+0

您需要計算多少次IF語句不正確。你真的需要2^6 = 64個語句,而不是6^2。如果你想要A =「blah」和A NOT =「blah」,那麼你需要2^7 = 128個檢查。 (hm,這是正確的嗎?) –

+0

(顯然,我不是說你實際上硬編碼128條語句) –

回答

2

做這種事情的方法是構建某種表達式樹。這可能只是標準對象列表。每個對象都有一個「檢查」方法來說明元素是否通過測試。你可以在運行時建立這個列表,然後用它來檢查每個候選人。

或者看看LINQ。它非常適合。

+0

有趣。那麼我正在考慮爲此做一個對象,但我雖然這會導致完全相同的問題。但是,也許不是......將不得不看這個。 – Rushino

+0

有很多種方法可以做到這一點。訣竅是記住您可以在運行時構建和使用數據結構。不要被「靜態」思考所束縛。 – Joe

+0

此解決方案完美工作。謝謝!你爲我節省了很多時間! – Rushino

0

我假設你正在構建一個sql命令。通常,我們只會放入一系列IF/CASE語句(每個可能的參數一個),以便追加SQL。但是現在,你可以使用LINQ:

var q = from c in Customers select c; 

if(!String.IsNullOrEmpty(param.Name)) 
    q = q.Where(c => c.Name.Contains(param.Name)); 

if(param.CustID.HasValue) 
    q = q.Where(c => c.ID == param.CustID); 

if(!String.IsNullOrEmpty(param.CustAddr)) 
    q = q.Where(c => c.Addr.Contains(param.CustAddr)); 

//use your results! 
+0

它應該是'q = q.Where ....',否則你只是扔掉新的'IQueryable'對象。 –

+0

所以這個想法基本上是用LINQ查詢來消除每一步的交易(那些不符合標準的交易)? – Rushino

+0

是的。逐步構建linq查詢。 –