如何在where子句中将UserDefinedFunctionProvider.Invoke与udfs一起使用

时间:2016-07-13 08:56:31

标签: .net linq azure-cosmosdb

我尝试在DocumentDB中创建一个用户定义的函数,以便在where子句中使用它,但执行查询会抛出Microsoft.Azure.Documents.Linq.DocumentQueryException,并显示以下消息:

不支持“System.Object”类型的常量。

以下代码说明了所描述的行为。我做错了吗?

string udfName = "udfDemo";
UserDefinedFunction udfDemo = new UserDefinedFunction()
{
    Id = udfName,
    Body = @"function(a, b) {
                return true;
             }"
};

UserDefinedFunction createdUdf = documentClient.UpsertUserDefinedFunctionAsync(documentCollectionUri, udfDemo).Result;

int intParameter1 = 1;

IQueryable<MyModel> query= documentClient
    .CreateDocumentQuery<MyModel>(documentCollectionUri)
    .Where(order =>
        (bool)UserDefinedFunctionProvider.Invoke(udfName, order.CancelationDetails, intParameter1));

var result = query.ToList();

2 个答案:

答案 0 :(得分:2)

我能够在恰好使用'Microsoft.Azure.DocumentDB 1.5.0'

的示例项目上重现这个问题

当我使用intParameter1替换Invoke来电中Convert.ToString(intParameter1)的引用时,错误消失了。

(我不知道为什么我自己刚刚开始使用这项技术)

然后,我尝试将这些软件包更新为Nuget 'Microsoft.Azure.DocumentDB.1.9.2'中的最新软件包,并恢复为仅使用intParameter1,现在也可以正常运行。

所以也许是一个已修复过的bug。特别是Release Notes 1.9.1个州

  

修复了使用用户时使用不同类型参数的能力   在LINQ中定义了函数。

答案 1 :(得分:0)

是的,此漏洞在此处报告后在.NET SDK 1.9.2中得到修复。

谢谢!