c# - 在 Lambda 表达式中为 Model 属性使用动态值

标签 c# asp.net-mvc lambda

我正在尝试在我的 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/

相关文章:

C# 注册嵌入式 Directshow 过滤器

c# - 如何声明 C# 匿名类型而不创建它的实例?

entity-framework - Entityframework 使用 join 方法和 lambda 进行连接

java - 在 Java 8+ 流中是否有等同于 break 的东西?

c# - 通过混合连接从客户端连接到 Azure Web 作业

c# - 刷新数据绑定(bind)组合框的内容 C# 问题

CSS 图像未在 ASP.NET MVC 中显示

javascript - 具有动态数据的 HighCharts 不起作用

asp.net - 轻松实现存储库模式

python - Pandas 中基于行计算的有效方法