在 LINQ 中创建表达式
Posted
技术标签:
【中文标题】在 LINQ 中创建表达式【英文标题】:Create a Expression in 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 我已将查询修改为可以理解的。 【参考方案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"
【讨论】:
我无法运行您的代码,如果这样做会引发以下异常 静态方法需要空实例,非静态方法需要非空实例。参数名称:实例 如果您不提供详细信息,就不能指望人们会帮助您。你是如何运行代码的,异常到底发生在哪里?以上是关于在 LINQ 中创建表达式的主要内容,如果未能解决你的问题,请参考以下文章
带有语句体的 lambda 表达式无法转换为 nopCommerce 中的表达式树 [重复]