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

C#如何将Expression-Func-转换为Expression-Func-分享

时间:2023-04-11 03:19:08 C#

C#如何将Expression转换为Expression没有手写经验。给定一个ExpressionoriginalPredicate,我想创建一个ExpressiontranslatedPredicate。在这种情况下,SomeType和OtherType具有相同的字段,但它们不相关(不继承且不基于公共接口)。背景:我有一个基于LINQtoSQL的存储库实现。我将LINQtoSQL实体投影到我的模型实体,以便将我的模型保存在POCO中。我想将表达式传递给存储库(作为规范的一种形式),但它们应该基于模型实体。但我无法将这些表达式传递给数据上下文,因为它需要基于LINQtoSQL实体的表达式。使用Expression,最简单的方法是使用转换表达式:classFoo{publicintValue{get;放;}}classBar{publicintValue{get;放;}}staticclassProgram{staticvoidMain(){Expression>predicate=x=>x.Value%2==0;表达式>convert=bar=>newFoo{Value=bar.Value};varparam=Expression.Parameter(typeof(Bar),"bar");varbody=Expression.Invoke(predicate,Expression.Invoke(convert,param));varlambda=Expression.Lambda>(body,param);//为简单起见,使用LINQ-to-Objects进行测试varfunc=lambda.Compile();boolwithOdd=func(newBar{Value=7}),withEven=func(newBar{Value=12});但请注意,不同的提供商将以不同的方式支持此功能。例如,EF可能不喜欢它,甚至LINQ-to-SQL也喜欢。另一种选择是完全重建表达式树,使用反射来查找相应的成员。更复杂。我找到了另一种方法,其中还包括包装原始委托。FuncExpressionConversion(Expression>expression){Expression>g=obj=>expression.Compile().Invoke(obj);返回g.Compile();没有隐式方法来进行翻译。您必须将现有的委托包装在一个lambda中,该lambda从参数类型创建一个新类型:vartranslatedPredicate=x=>originalPredicate(OtherTypeFromSomeType(x))OtherTypeFromSomeType从SomeType参数创建一个OtherType的实例。我和你有同样的问题,我用EF解决了它:varviewModeValue=dbContext.Model.Select(m=>newViewModel{Field=m.Field}).Where(predicate)//predicateisanExpression>entityframework知道如何构建正确的sql命令。转换表达式要复杂得多,因为它被构建为不可变的,如果你做错了可能会导致不希望的运行时影响,至少在我的情况下不需要它。以上就是C#学习教程:HowC#convertsExpressiontoExpression分享的所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多加关注——这篇文章来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: