我正在尝试在我的 Lambda Express 中动态生成模型属性。在我的 Controller 中,我有以下方法:
public ActionResult FilterSubCategory(string filter, string selected)
{
IList<Item> model = db.Items.Where(p => p.Make == selected).ToList();
var viewModel = Mapper.Map<IList<ItemViewModel>>(model);
return View("~/Views/Phone/Index.cshtml", viewModel);
}
我想使用此方法来过滤我页面的列,因此我传递了过滤器(要过滤的模型属性)和实际选择的属性值。
我想用传递的 filter 字符串的值替换此处的 'Make'(此处为“硬编码”)。有办法做到这一点吗?
最佳答案
这是我的做法:
public static Expression<Func<TModel, TProperty>> GenerateModelExpression<TModel, TProperty>(PropertyInfo property)
{
ParameterExpression fieldName = Expression.Parameter(typeof(TModel), "m");
var propertyExpr = Expression.Property(itemExpr, property.Name);
return Expression.Lambda<Func<TModel, TProperty>>(propertyExpr, fieldName);
}
在您的情况下,属性参数将是“Make”,您可以使用反射获得它。
https://github.com/AmmarCSE/razor-grid
编辑
在更准确地审查问题并引用@Servy 之前的回答后,How do i create the following LINQ expression dynamically? ,这是一个解决方案:
public static Expression<Func<TModel, TProperty>> GenerateModelExpression<TModel, TProperty>(string filter, string select)
{
ParameterExpression param = Expression.Parameter(typeof(TModel), "m");
var body = Expression.Equal(Expression.Property(param, typeof(TModel).GetProperty(filter))
, Expression.Constant(select));
return Expression.Lambda<Func<TModel, TProperty>>(body, param);
}
关于c# - 在 Lambda 表达式中为 Model 属性使用动态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23015273/