Tag: 表达式树

如何在运行时计算表达式参数?

我需要解决的问题是通过IF语句运行数据。 IF语句由运行时的SQL表生成。 我已经设法通过使用表达式和Lambda表达式来完成此操作。 我的表有memberName; 操作; 目标。 所以例如我从表中得到“Age”,“GreaterThan”和“40”,然后我编译它。 var rule = new Rule(rowRule[“memberName”].ToString(), rowRule[“Operator”].ToString(), rowRule[“Target”].ToString()); Func compiledRule = CompileRule(rule); 我得到一个真或假的价值,它完美无缺。 public static Func CompileRule(Rule r) { var paramUser = Expression.Parameter(typeof(User)); Expression expr = BuildExpr(r, paramUser); // build a lambda function User->bool and compile it return Expression.Lambda<Func>(expr, paramUser).Compile(); } static Expression BuildExpr(Rule r, ParameterExpression param) { var […]

将表达式树转换为字符串,反之亦然,用于WCF

我想将表达式树转换为字符串,反之亦然,以便在WCF客户端和服务器查询表达式中使用 将表达式树转换为字符串以发送到服务器并将字符串转换为服务器中的表达式树,因此需要此转换器 似乎System.Linq.Dynamic是一个很好的库,所以如果是的话请给我一个例子,如果没有请任何人给我一个解决这个问题的方法 我不知道System.Linq.Dynamic如何为这个目标工作(请举例) *******当然我想使用Serialize.Linq将Expression树转换为可序列化的对象,但是这个库对我来说不起作用,因为这个问题

使用表达式树通过单个属性比较对象网络InvalidOperationException

我正在尝试使用表达式树,因为基于描述,这似乎是最正确(高效,可配置)的方法。 我希望能够创建一个语句,该语句从existingItems集合中获取与incomingItem的propertyNameToCompareOn值匹配的第一项。 我有一个带有以下签名和模拟代码体的方法…… DetectDifferences(List incomingItems, List existingItems) { var propertyNameToCompareOn = GetThisValueFromAConfigFile(T.FullName()); //does this belong outside of the loop? var leftParam = Expression.Parameter(typeof(T), “left”); var leftProperty = Expression.Property(leftParam, identField); var rightParam = Expression.Parameter(typeof(T), “right”); var rightProperty = Expression.Property(rightParam, identField); //this throws the error var condition = Expression.Lambda<Func>(Expression.Equal(leftProperty, rightProperty)); foreach (var incomingItem in incomingItems) //could be […]

如何通过在C#中解析Xml来创建表达式树?

我期待通过使用C#解析xml来创建表达式树。 xml将如下所示: 或者另一个例子…… ……关于从哪里开始的任何指示都会有所帮助。 亲切的问候,

无法从一组表达式创建复合表达式<Func >

(对底部的回答) 我正在尝试构建一个结合的系统 Func 委托给ExpressionTree,它允许我传入一个值(在这种情况下为badValue)并在谓词全部返回true并考虑二进制操作时获取bool。 这是我第一次使用Expression / ExpressionTrees,所以请保持温和。 我收到这个错误: ArgumentException:无法调用“System.Boolean”类型的表达式 在这条线上: collectAnswers = Expression.And(isEmpty.Body, Expression.Invoke(… 我已经设置了那条线,因为我需要在所有表达式中共享对value的引用(对吗?)。 我理想的情况是只有一堆 Expression<Func> 我可以将它们与逻辑运算符(和/或/不)一起传递到系统中,并在最后得到一个bool。 希望能够动态构建值必须通过的规则。 在我要走的路上,这有可能吗? 如果没有,那么指引我走正确道路的几条指针将不胜感激。 string badValue = “hello!”; const int minSize = 8; const int maxSize = 30; Expression<Func> stringLengthMax = value => value.Length < maxSize; Expression<Func> stringLengthMin = value => value.Length > minSize; Expression<Func> isEmpty = value […]

表达式树 – 如何获取声明实例?

当谈到表达树时,我是新手,所以我不确定如何提出这个问题或使用什么术语。 这是我正在尝试做的过于简化的版本: Bar bar = new Bar(); Zap(() => bar.Foo); public static void Zap(Expression<Func> source) { // HELP HERE: // I want to get the bar instance and call bar.Zim() or some other method. } 我怎样才能在Zap方法中使用bar?

使用List .Contains方法为LINQ构建表达式树

问题 我正在为我们的Web应用程序中的几个报告重构一些LINQ查询,并且我试图将一些重复的查询谓词移动到他们自己的IQueryable exension方法中,以便我们可以将它们重用于这些报告,并在将来报告。 你可以推断,我已经为组重构了谓词,但是代码的谓词给了我一些问题。 这是我到目前为止报告方法之一的一个例子: DAL方法: public List GetQueryView(Filter filter) { using (var context = CreateObjectContext()) { return (from o in context.QueryViews where (!filter.FromDate.HasValue || o.RepairDate >= EntityFunctions.TruncateTime(filter.FromDate)) && (!filter.ToDate.HasValue || o.RepairDate <= EntityFunctions.TruncateTime(filter.ToDate)) select o) .WithCode(filter) .InGroup(filter) .ToList(); } } IQueryable扩展: public static IQueryable WithCode(this IQueryable query, Filter filter) { List codes = DAL.GetCodesByCategory(filter.CodeCategories); […]

如何组合Expression <Func > ?

我有一个数组 Expression<Func> 但是,我想将它们全部组合在一起以获得该类型的单个项目。 我该怎么做呢? 我可以投射Expression.And的结果吗?

如何创建表达式树以执行类似于SQL“Like”命令的操作

我正在研究由同事编写的一些表达式树代码,并且正在研究添加其他表达式的可能性。 它目前支持:equals,not-equals,IsNull等。我需要添加一些东西,允许它使用类似于SQL“Like”命令或使用正则表达式的通配符比较。 目前,代码解析XML文件并提取数据,然后使用类似于下面所示的代码的代码处理这些数据。 这是“平等”表达的一个例子。 “callExp”是一个MemberExpression,它基本上保存了我的表(Entities)的字段名称,而GetConstantExpression获取了我正在比较的数据的详细信息。 xRet = Expression.MakeBinary(ExpressionType.Equal, callExp, GetConstantExpression(element.Element(“Value”), callExp.Type)); 我所追求的是一种创建类似于“Like”命令的“Expression”的方法。 这可以使用类似于上面的几行来完成,还是会更复杂? 有什么好的资源可以帮助这个领域吗? ================================================== ================================ 基于反馈的新代码: 我正在看一些例子,并尝试了以下我希望能创建一个表达式。 它给了我下面显示的错误。 我是否朝着正确的方向创建“StartsWith”表达式? _entityExp是对MyClass的ParameterExpression引用。 ParameterExpression p = Expression.Parameter(_entityExp.Type, “entity”); MethodInfo method = typeof(string).GetMethod(“StartsWith”, new[] { typeof(string) }); var containsMethodExp = Expression.Call(p, method, Expression.Constant(“root”), p); 在’System.String’类型上声明的方法’Boolean StartsWith(System.String)’不能使用’MyClass’类型的实例调用

通过为T引入一个常量,将表达式<Func >转换为Expression <Func >

我有一个Expression<Func>格式的Expression<Func> ,我需要通过将第一个表达式中的T替换为Expression<Func>的格式转换为表达式恒定价值。 我需要这个作为表达式保留,所以我不能只用一个常量作为第一个参数来调用表达式。 我已经看过这里有关表达树的其他问题,但我无法找到解决问题的方法。 我怀疑我必须走表达式树来引入常量并删除一个参数,但我甚至不知道从哪里开始。 🙁