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

对于传递Expression vs. Func参数感到困惑分享

时间:2023-04-10 22:17:50 C#

C#学习教程:对传递表达式与Func参数感到困惑当有人将方法签名从publicstaticListThingList(FuncaWhere)更改为publicstaticListThingList(ExpressionaWhere)时会出现此问题,这破坏了我的调用代码。旧的调用代码(有效)如下所示:...objecty=newobject();FuncwhereFunc=(p)=>p==y;事物=ThingManager.ThingList(whereFunc);效果)如下:...objectx=newobject();表达式whereExpr=(p)=>p==x;事物=ThingManager.ThingList(whereExpr);在使用表达式的行上ThingList(…)在内部失败:varquery=(fromtincontext.Things.Where(aWhere)...运行时错误:无法创建类型为“System.Object”的常量值。在此上下文中仅支持基本类型(“例如Int32、String和Guid”)。该示例是设计使然,但我的猜测是它与本地对象变量x没有被正确“复制”到表达式。有人可以解释如何处理这种情况,以及为什么Func有效而Expression无效?更改的原因几乎可以肯定是将谓词的评估“推送”到支持您的上下文的底层存储。更改后的API的作者决定使用IQueryable并需要一个Expression>,而不是将所有事物都放入内存中,然后使用Func来决定保留哪些。您对错误的起源是正确的:与内存谓词不同,IQueryable不能使用它不知道的对象,例如对象的任意实例。您需要做的是更改表达式以避免引用目标数据存储不支持的数据类型的对象(我假设表达式最终出现在实体框架或Linq2Sql上下文中)。例如,而不是说objectx=newobject();表达式>whereExpr=(p)=>p==x;事物=ThingManager.ThingList(whereExpr);你应该说Thingx=newThing{id=123};表达式>whereExpr=(p)=>p.id==x.id;事物=ThingManager.ThingList(whereExpr);(您的后备存储几乎可以理解整数)Expression和Func之间的区别在此处的答案中更好的描述:Expression>和Func之间的区别使这项工作再次快速解决的方法是将表达式编译回Func。以上是C#学习教程:我对传递Expressionvs.Func参数感到困惑。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varquery=(fromtincontext.Things.Where(aWhere.Compile())本文采集自互联网,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: