如何解决如何在Cosmos DB SDK v3中使用LINQ调用UDF?
用于Cosmos DB的LINQ to SQL转换的documentation:
用户定义的函数扩展功能:支持从存根方法UserDefinedFunctionProvider转换。调用到相应的用户定义的函数。
但是,此功能在.NET SDK v3中不能公开访问(尽管在v2中)。那么,修复该错误之前的解决方法是什么?
解决方法
有几种解决方法:
- 不要使用LINQ。
- 使用LINQ但不调用UDF,然后使用
query.ToQueryDefinition.QueryText
获取查询字符串,并操纵它以在需要的地方插入UDF调用,然后评估SQL字符串(糟糕!)。 - 抓住它。首先添加一个虚拟方法:
public static object Invoke(string udfName,object[] arguments) { return null; }
每当您另外使用UserDefinedFunctionProvider.Invoke
时,请在lambda表达式中使用此方法。实现一个ExpressionVisitor
来替换所有出现的MethodCallExpression mce
与mce.Method
匹配虚拟方法的地方{1>
Expression.Call(null,udfMethod,mce.Arguments[0],mce.Arguments[1])
udfMethod
在哪里
MethodInfo udfMethod = typeof(CosmosClient).Assembly
.GetType("Microsoft.Azure.Cosmos.Linq.UserDefinedFunctionProvider",throwOnError: true)
.GetMethod("Invoke",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
在Where
,Select
等中使用结果表达式。
(添加一个单元测试,以检查何时修复了该错误,并且可以删除该hack。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。