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

ConvertingList.ContainstoExpressionTree分享

时间:2023-04-10 18:57:19 C#

ConvertingList.ContainstoExpressionTree碰到这个查询,想写个ExpressionTree版本:Listlst=newList{1,2};从myTbl中的a.Age=20&&lst.Contains(a.Status)选择a我写了这段代码:Listlst=newList{1,2};varparam=Expression.Parameter(typeof(T),"o");varbody=Expression.AndAlso(Expression.Equal(Expression.PropertyOrField(param,"Age"),Expression.Constant(20)),Expression.Call(Expression.PropertyOrField(param,"Status"),"Contains",类型.EmptyTypes,Expression.Constant(lst)));varlambda=Expression.Lambda(body,参数);返回拉姆达;我收到错误消息:“'System.Nullable`1[System.Byte]'类型上没有方法'包含'。”请帮我找出问题所在。谢谢问题是您已将两个参数切换到Expression.Call并且您的代码试图创建无意义的表达式o.Status.Contains(lst)。您需要切换两个参数:Expression.Call(Expression.Constant(lst),"Contains",Type.EmptyTypes,Expression.PropertyOrField(param,"Status"))这假设您使用的LINQ提供程序理解List.Contains().如果您需要Enumerable.Contains(),请查看IvanStoev的回答。contains转换为表达式树的区别在于我们在那里调用了一个字符串实例Contains方法,而这里我们需要调用一个静态泛型方法Enumerable.Contains:publicstaticboolContains(thisIEnumerablesource,TSourcevalue)可以得到通过使用AnotherExpression.Call重载来实现:publicstaticMethodCallExpressionCall(Typetype,stringmethodName,Type[]typeArguments,paramsExpression[]arguments)像这样:以上就是C#学习教程:ConvertingList.Containstoanexpressiontree分享如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—//Enumerable.Contains(lst,a.Status)varcontainsCall=Expression.Call(typeof(Enumerable),//type"Contains",//methodnewType[]{typeof(byte?)},//泛型类型参数(TSource)Expression.Constant(lst),//arguments(source)Expression.PropertyOrField(param,"Status")//参数(value));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: