【问题标题】:Create a Expression in LINQ在 LINQ 中创建表达式
【发布时间】:2012-07-12 08:41:36
【问题描述】:

我的 LINQ 查询类似于下面的代码。

 var data2 = data.Where(c => String.Format("{0:MM/dd/yyyy}", c.OrderDate) == "07/04/1996");

我需要在下面的表达式中自定义格式化列的谓词。我需要为谓词编写表达式并根据格式过滤数据。请检查以下代码。

pred =Expression.Equal(membertype, Expression.Constant(value, type));
lambda = Expression.Lambda(predicate, paramExpression);
source.Where(paramExpression, predicate);

谢谢。

【问题讨论】:

  • 为什么这个需要被转换?它不工作吗?而且,它已经是一个 lambda 表达式了……
  • 这已经是一个 lambda 表达式。通过this
  • 我已将查询修改为可以理解的。

标签: c# linq


【解决方案1】:

这是一个动态创建.Where 的示例。

static void DynamicWhereBuilder() {
  var datas = new Data[] {
    new Data { OrderDate  = "07/04/1996"},
    new Data { OrderDate  = "07/04/1990"},
    new Data { OrderDate  = "07/04/2001"},
    new Data { OrderDate  = "2012/04/07"}
  };
  IQueryable<Data> queryableData = datas.AsQueryable<Data>();

  var formatConstant = Expression.Constant("{0:MM/dd/yyyy}", typeof(string));
  var parameter = Expression.Parameter(typeof(Data), "dataArg");
  var property = Expression.Property(parameter, "OrderDate");

  var left = Expression.Call(property, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(object) }), formatConstant, property);
  var right = Expression.Constant("07/04/2001", typeof(string));

  var equal = Expression.Equal(left, right);
  var whereCallExpression = Expression.Call(
    typeof(Queryable),
    "Where",
    new Type[] { queryableData.ElementType },
    queryableData.Expression,
    Expression.Lambda<Func<Data, bool>>(equal, new ParameterExpression[] { parameter }));
  var results = queryableData.Provider.CreateQuery<Data>(whereCallExpression); // returns the object with OrderDate = "07/04/2001"
}

【讨论】:

  • 我无法运行您的代码,如果这样做会引发以下异常 静态方法需要空实例,非静态方法需要非空实例。参数名称:实例
  • 如果您不提供详细信息,就不能指望人们会帮助您。你是如何运行代码的,异常到底发生在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多