2011-06-06 62 views
1

我似乎無法將我的想法包圍在這個概念中......我想允許用戶將一些「過濾器」應用於數據集(最好在查詢字符串中以允許爲過濾結果添加書籤),使用Rob Conery的大量動態數據訪問「工具」。如何在ASP.NET MVC中使用querystring值編寫「動態sql」過濾器?

我可以簡單地寫一大堆if,然後通過每個「規則」我寫一個直接查詢......但這似乎打敗了「動態sql」的目的。

在C#/ ASP.NET MVC中是否有一個通用模式/最佳實踐?

回答

1

我認爲這個概念有點寬泛,說有這樣一種模式/最佳做法。這就是說,我想使用類似LINQ to SQL或實體框架將使一個良好的動態查詢引擎,因爲你可以做這樣的東西:

var query = DBContext.Items.Select(x => x.Name); 

switch(QueryString["Type"]) 
{ 
    case "Dog": 
     query = query.Where(x => x.Type == "Dog"; 
     break; 
    case "Cat": 
     query = query.Where(x => x.Type == "Cat"; 
    etc.... 
} 

query = query.Where(x => x.Owner.Name == QueryString["Owner"]); 

ResultsDataGrid.Datasource = query; 

顯然,有些僞代碼中有,但對LINQ的好東西這種情況下的SQL是延遲執行。 query在數據綁定之前不會運行,並且包含您動態添加的任何過濾器。它還爲您提供了類型安全性並將防止SQL注入。您可以通過實際構建將在最後運行的SQL查詢來做類似的事情,但它會很容易出錯,並且需要大量的檢查和平衡。

+0

謝謝...那麼我想動態應用多個過濾器的情況呢? – Chaddeus 2011-06-06 14:12:49

+0

上面的例子就是這樣做的。查詢首先選擇所有項目。然後,根據「Type」查詢字符串變量,它將過濾最初的項目。然後,根據「Owner」查詢字符串變量,它將進一步過濾。每次添加過濾器時,查詢都不會實際運行,只有在最後需要時纔會執行。您還可以添加條件過濾器,如:if(needed){// addExtraQueryHere;}'lines。 – Ocelot20 2011-06-06 15:41:05

+0

啊,我在'switch'看到'break'了。我正在跟蹤。謝謝! – Chaddeus 2011-06-07 03:59:44

相關問題