如何在C#/ ASP.NET MVC中实现搜索功能

dna*_*oli 11 .net c# asp.net-mvc search

我正在使用C#和Razor开发ASP.NET MVC 3应用程序.

我有一个看起来像这样的搜索表单: searchform

搜索表单以下列方式工作:

  1. 用户选择他们想要搜索的属性.
  2. 用户选择他们想要匹配搜索字符串的方式(例如包含,开头,结尾,等等).
  3. 用户输入搜索词并单击"搜索".

第一个下拉列表中的选择直接与我的ADO.NET Entity Framework模型类中的属性相关(因此直接与表列相关).

用户需要能够在搜索时明确选择哪个属性和哪个匹配方法,例如用户将明确搜索等于'132'的进程号的所有匹配.

我的第一种方法是使用动态linq从搜索条件构造Where子句(参见我原来的问题).但是我开始认为这不是最好的方法.

我也希望有一个解决方案,不需要我为每个属性+匹配标准组合硬编码结果.

有关如何实施此搜索的任何建议?它不必使用我当前的搜索表单,完全接受符合要求的任何其他想法.

Bla*_*erX 12

您是否考虑过将Lucene.NET用于此项目?考虑到搜索的性质,使用Lucene进行构建非常简单,因为它允许您根据需要组合不同列上的过滤器


Vin*_*ayC 4

您可以使用代码为 where 谓词构建表达式树。例如,

public static IQueryable<T> DynamicWhere<T>(this IQueryable<T> src, string propertyName, string value)
{
    var pe = Expression.Parameter(typeof(T), "t");
    var left = Expression.Property(pe, typeof(T).GetProperty(propertyName));
    var right = Expression.Constant(value);
    // Illustrated a equality condition but you can put a switch based on some parameter
    // to have different operators
    var condition = Expression.Equal(left, right);

    var predicate = Expression.Lambda<Func<T, bool>>(condition, pe);
    return src.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)

将其用作Orders.DynamicWhere(searchBy, searchValue). 您可以再添加一个参数来接受等于、大于等运算符来完成该功能。

请参阅这些链接以获取更多信息:

http://msdn.microsoft.com/en-us/library/bb882637.aspx

http://msdn.microsoft.com/en-us/library/bb397951.aspx

另请检查Expression 类的方法列表以了解情况。