2010-12-14 74 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