在Lambda表达式中使用Model属性的动态值

时间:2014-04-11 14:22:07

标签: c# asp.net-mvc lambda

我试图在Lambda express中动态生成模型属性。在我的控制器中,我有以下方法:

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);
}

我想使用此方法过滤我的网页列,以便我将过滤器(模型属性转换为过滤器)和实际选定的属性值传递。

我想在此处替换&#39;制作&#39; (&#39;硬编码&#39;此处),并传递过滤器字符串的值。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

这就是我的所作所为:

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);
}

属性参数将是&#39;制作&#39;在你的情况下,你可以使用反射。

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);
}