如何在Lambda中搜索表的所有字段

时间:2014-03-11 09:33:10

标签: c# asp.net-mvc lambda

这是一个ASP.NET MVC项目。 我想从视图中查询具有特定文本框值的数据库表。 这会查询两个字段:

public ActionResult Index(string search)
{
    return View(db.KDtable
                  .Where(x =>
                    x.Name.StartsWith(search)
                    || x.Description.StartsWith(search)
                    || search == null)
                  .ToList()
                );
}

string search是文本框的值。

问题:

我怎样才能,而不是手动将所有字段添加到lambda表达式,例如x.City.StartsWith(search),只需简单明了地查询所有表字段和文本框中的输入。

THX

1 个答案:

答案 0 :(得分:0)

试试这个:

public static Expression<Func<T,bool>> CreateTextSearch<T>(string searchText)
{
    Type t = typeof(T);
    var props = t.GetProperties().Cast<PropertyInfo>().Where(p => p.PropertyType == typeof(string));

    var searchTextExpr = Expression.Constant(searchText);
    var tParameterExpr = Expression.Parameter(typeof(T));

    Expression expr = null;
    foreach(var prop in props)
    {
        var criteria = Expression.Call(
            Expression.Property(tParameterExpr, prop),
            typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }),
            searchTextExpr);
        if(expr == null)
            expr = criteria;
        else
            expr = Expression.Or(expr, criteria);
    }
    return Expression.Lambda<Func<T,bool>>(expr, tParameterExpr);
}

这样称呼:IQueryables为MySet.Where(CreateTextSearch<MyType>("DDD"));,常规IEnumerables为MySet.Where(CreateTextSearch<MyType>("DDD").Compile());