这是一个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
答案 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());
。