2010-12-14 72 views
1

我正在尋找一種動態的方式來在我的MVC 1.0應用程序中實現搜索。MVC 1.0中的動態搜索選項

假設我有一個包含文本框,下拉菜單和按鈕的用戶控件。用戶將在文本框中輸入查詢,在下拉列表中選擇要搜索的列,然後按搜索按鈕。

做上述活動我想這樣做模型:

context.MyViewOrTableName.Where(p => (p.ColumnNameFromTheDropdown.Contains(DataFromTheTextbox))); 

無論上述情況是可能的MVC 1.0,如果這樣的話怎麼辦? 任何幫助,將不勝感激。

解決方案:

context.MyViewOrTableName.Where("" + ColumnNameFromTheDropdown + ".Contains(@0)", DataFromTheTextbox); 

這件事發生,包括命名空間System.Linq.Dynamic斯科特創建,並在下面後奧馬爾稱後才。

回答

1

您正在尋找的是一種構建dynamic LINQ queries的方法。你可以搜索一些關於它的細節和選項,但是,我相信Scott Guthrie寫的Dynamic Linq library正是你想要的。

它可以讓你從字符串構建查詢:

var query = 
    db.Customers. 
    Where("City = @0 and Orders.Count >= @1", "London", 10). 
    OrderBy("CompanyName"). 
    Select("new(CompanyName as Name, Phone)"); 
+0

不錯的一點。其實我只是在那個角度尋找。 – 2010-12-14 06:39:09

+0

你的回答引導我朝着正確的方向前進。 – 2010-12-15 11:23:45

2

我目前正在做類似的事情。

也就是說,我有一個包含各種搜索選項(複選框,下拉,文本框)的MVC視圖,並且我想要一個優雅的方式來返回「搜索結果」。

所以我創建了一個簡單的類 - 例如「ProductSearchCriteria」。

該類只包含用於不同搜索選項的getters/setters。 (我通過模型綁定提交表單時填充)。

我再接受我的BLL方法這種類型作爲參數:

public ICollection<Product> FindProductsForCriteria(ProductSearchCriteria criteria) 
{ 
    return _repository // GenericRepository<Product> 
     .Find() // IQueryable<Product> 
     .WithSearchCriteria(criteria) // IQueryable<Product> 
     .ToList(); // List<Product> 
} 

至於如何應用過濾器,以及依賴於幾件事情。首先,我不知道你是否使用Linq-To-Sql,NHibernate,Entity-Framework等。同時它還取決於你的架構(存儲庫)。

你不能夠通過lambda表達式「動態地」應用過濾器(不容易,反正)。

我做什麼創建一個擴展方法優雅地應用過濾器:

public static IQueryable<Product> WithSearchCriteria(this IQueryable<Product> source, ProductSearchCriteria criteria) 
{ 
    var query = source; 

    if (criteria.SearchFilterOne != null) 
     query = query.Where(x => x.FieldInModel == criteria.SearchFilterOne); 
    // inspect other criteria 
} 

正如我所說的,這取決於你的架構和ORM。我使用實體框架4.0,它支持推遲執行,這意味着我可以建立對我的對象(IQueryable)的查詢,並在執行查詢之前應用過濾器。

HTH。

+0

@Arup喬杜裏 - 不是一個問題,只是想分享我的經驗。快樂的編碼! :) – RPM1984 2010-12-15 11:30:49