当前位置: 首页 > 编程语言 > C#

在C#中使用Expression.AndAlso()拆分表达式导致异常分享

时间:2023-04-10 16:59:23 C#

C#中使用Expression.AndAlso()拆分表达式导致异常在我用C#编写的项目中,我发现了一个巨大的谓词在linq的这个方法中使用:publicstaticIQueryableWhere(thisIQueryablesource,Expressionpredicate);这个谓词工作得很好,但在我理解它挣扎之前,它经常在很多情况下。我希望它是可读的。所以我写了几个表达式。但是我有一个像这样的运行时异常:可怕的“ParameterisnotboundinthespecifiedLINQtoEntitiesqueryexpression”异常我想尝试答案,但我仍然不明白为什么参数(c)是一个问题,请参阅://在一个方法中Func>expr1=(query)=>return(c)=>...;Func>expr2=(query)=>return(c)=>...;varexpr=Expression.AndAlso(expr1("astring").Body,expr2("samestring").Body);返回Expression.Lambda(expr,expr1("astring").Parameters[0]);我的问题是要了解为什么会发生此异常,而我最终会回到巨大的谓词。因为您看到的是单个c参数,所以实际上有两个不同的c参数(我们称它们为c1和c2)。因此,当您组合两个表达式时:c1=>c1.Something&&c2.SomethingElse;CLR因为找不到c2而生气。更糟糕的是,当您编写代码时,您有三个c!c3=>c1.Something&&c2.SomethingElse这是因为你重构expr1("astring")两次(在Expression.AndAlso(expr1("astring").Body和expr1("astring").Parameters[0])!你应该保存它!vartemp1=expr1("astring");vartemp2=expr2("samestring");varexpr=Expression.AndAlso(temp1.Body,temp2.??Body);//现在修复expr,使其使用temp1的参数returnExpression.Lambda>(expr,temp1.Parameters);对于一个明显的例子:vartemp1a=expr1("astring");vartemp1b=expr1("astring");vartemp2=expr2("samestring");Console.WriteLine(temp1a.Parameters[0]==temp1b.Parameters[0]);//假Console.WriteLine(temp1a.Parameters[0]==temp2.Parameters[0]);//FalseNow...我的参数替换版本:publicclassSimpleParameterReplacer:ExpressionVisitor{publicreadonlyReadOnlyCollectionFrom;publicreadonlyReadOnlyCollectionTo;publicSimpleParameterReplacer(ParameterExpressionfrom,ParameterExpressionto):this(new[]{从},new[]{到}){}publicSimpleParameterReplacer(IListfrom,IListto){if(from==null||from.Any(x=>x==null)){thrownewArgumentNullException("from");}if(to==null||to.Any(x=>x==null)){thrownewArgumentNullException("to");}if(from.Count!=to.Count){thrownewArgumentException("to");}//请注意,我们应该真正从和克隆到...但是我们将//忽略它!从=新的ReadOnlyCollection(从);To=newReadOnlyCollection(to);}protectedoverrideExpressionVisitParameter(ParameterExpressionnode){intix=From.索引(节点);如果(ix!=-1){node=To[ix];}returnbase.VisitParameter(node);你可以改变单个参数或参数数组...你可以使用这个:以上是C#学习教程:在C#中使用Expression.AndAlso()拆分表达式会导致异常共享所有内容.如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——vartemp1=expr1("astring");vartemp2=expr2("相同的字符串");varexpr=Expression.AndAlso(temp1.Body,temp2.??Body);expr=newSimpleParameterReplacer(temp2.??Parameters,temp1.Parameters).Visit(expr);返回Expression.Lambda>(expr,temp1.Parameters);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: