2013-08-07 40 views
2

案例:
ASP.NET MVC,C#和ExtJS。用戶有一個過濾器,他可以在其中選擇多個值。有13個這樣的過濾器,用戶可以添加它們或從UI中刪除。是否有更多優雅的方法用於多重條件驗證

問題:
在服務器端我有這個類用於獲取過濾器值:

public List<string> Filter1 { get; set; } 
public List<string> Filter2 { get; set; } 
... 
public List<string> Filter13 { get; set; } 

然後我從數據庫中選擇數據,並將其轉換爲IEnumerable<DataClass>其中DataClass是看起來象下面這樣:

public string Data1 { get; set; } 
public string Data2 { get; set; } 
... 
public string Data13 { get; set; } 

然後我過濾此數據是這樣的:

if (filter.Filter1 != null && filter.Filter1.Any()) { 
    data = data.Where(x => filter.Filter1.Contains(x.Data1)); 
} 
... 
if (filter.Filter13 != null && filter.Filter13.Any()) { 
    data = data.Where(x => filter.Filter13.Contains(x.Data13)); 
} 

所以有13 if和13基本相同的過濾邏輯。這段代碼看起來很可怕。有什麼辦法可以製作更漂亮的過濾器嗎?

加: Filter1可以通過僅適用於Data1等。

+0

你可以修改Filter類嗎? – WiiMaxx

+0

@WiiMaxx,你在哪裏找到一個過濾器類?只有'Filter [n]'名稱的屬性。 – colotiline

+0

當然,但你寫了「在服務器端,我有這個類獲取過濾器」,所以我認爲'過濾器'是一個過濾器的對象,因此我問你,如果你能夠修改這個類 – WiiMaxx

回答

0

我想創建一個數組:

private static const int N = 13; 

public string[] Data = new string[N]; 
public List<string>[] Filter = new List<string>[N]; 
//------------------------------------------------------------------------------ 
for(int i = 0; i < N; i++) 
{ 
    if(filter.Filter[i] != null && filter.Filter[i].Any()) { 
     data = data.Where(x => filter.Filter[i].Contains(x.Data[i])); 
} 
0

我不完全理解你正在試圖做的:你有filtertypes的13名名單,如果過濾器設置(或由用戶選擇),你會得到一個單獨的字符串(fi'data1'爲filter1)並嘗試匹配?

這聽起來像是你設置數據結構的方式出錯了......你認爲當你看到這麼多的重複代碼時可能有更好的解決方案是正確的:-)也許你可以解釋你試圖實際做什麼的功能?

說了這些之後,可能會從實施像戰略模式這樣的設計模式中受益,在這種模式下,您根據具體情況獲得不同的行爲(策略)(How does the Strategy Pattern work?)。但是,如果你首先解釋你想要達到的目標,那可能會更好。

+0

我對客戶的報告有很大的聯繫,我從13個表中選擇了13個字段(我無法更改數據結構或報告)。 'DataClass'表示我的選擇。我有13個過濾器。用戶可以添加它們。在用戶添加過濾器後,它會通過可能的值加載。因此'Filter1'從'Table1'中加載了可能的值。這是原因,因爲我可以將'Filter1'僅應用於'Data1'。例如:我爲具有「國家/地區」字段的報告選擇數據。然後添加過濾器'國家'並選擇值'比利時'。然後選擇的值應該按'國家'字段過濾報告。 – colotiline

+0

我試圖理解你在說什麼,但很難......但從我的理解,是不是答案0699給了你可以使用? –

+0

你不明白我是如何描述這個問題的(對語言的誤解)或者我描述的(誤解了描述)? – colotiline

0

使用表達式樹。這會讓你的工作更輕鬆。

相關問題