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

如何将LINQ查询的一部分移动到可重用的LINQ表达式树Share

时间:2023-04-11 11:02:56 C#

HowtomoveapartofLINQquerytoareusableLINQexpressiontree我想通过使用表达式树的一部分来重用LINQ查询the(我想这就是它的名字)。这是我的查询的简化版本:varlQuery=frommin...joinain...intotafromrainta.DefaultIfEmpty()selectnew{...Status=ra!=null?...:...,/*<-我希望它可以重用*/...};如您所见,Status的值由LINQ通过?:?:语法(我认为是一个表达式树,SQL日志在末尾显示一个CASEWHEN查询)。如何将该代码移动到单独的函数,以便我的应用程序不会在运行时抛出NotSupportedException?我尝试添加一个函数publicstaticSystem.Linq.Expressions.ExpressionQueryStatusExpression(){returnra=>ra!=null?……:……;}然后像Status=QueryStatusExpression().Invoke(ra)一样使用它,但它会抛出NotSupportedException。我现在没主意了。任何帮助表示赞赏。这个问题可以用LINQKit项目的组合表达式来解决。方法如下:向项目添加LinqKit引用(例如,通过NuGet包管理器)。在.cs文件的顶部添加以下行,使LINQKit的扩展方法可以使用LinqKit;//System.Linq.Expressions.Expression.Invoke()将表达式定义为静态字段publicstaticSystem.Linq.Expressions.Expression>GetStatusExpression=ra!=null?……:……;在查询中调用表达式(确保将.AsExpandable()添加到第一个表,如LINQKit文档中所述)varlQuery=frommin%firsttable%.AsExpandable()...joinain...intotafromrainta.DefaultIfEmpty()selectnew{...Status=GetStatusExpression.Invoke(ra),...};如果你想在“普通”代码中使用表达式,那么你需要先编译它publicstaticSystem.FuncGetStatusExpressionCompiled=GetStatusExpression.Compile();...if(GetStatusExpressionCompiled(ra)==...){...非常感谢svick用它的评论指出了我正确的方向。编辑了我的答案,因为我没有发现EF翻译问题。使用vanilla代码,当您尝试抽象它时,您将始终有一个函数委托来处理(因为您的表达式将变成Expression>),这意味着当查询提供者发现自己无法解释该函数时,它必须这样做代表将阻止。要解决这个问题,您将不得不依赖像LINQKit这样的库,它们允许您将表达式组合在一起,或者基本上是您自己编写它们。(见这个讨论)。这段代码的动机似乎是基本上执行左连接并为没有匹配的行替换默认值而不是null。我认为在这种情况下,有必要了解您要完成的任务。您最好将逻辑上下移动一层。您可以将默认值逻辑移动到数据库中的视图或存储过程中以合并它。您也可以使用您想要的方法,首先使用结果集,然后对内存中的对象进行查询,这样您就不必担心它会变成SQL查询。以上是C#学习教程:HowtomovepartofLINQquerytothereusableLINQexpressiontree。收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢