【问题标题】:Filtering on navigation properties for a set of value with toLowerCase使用 toLowerCase 过滤一组值的导航属性
【发布时间】:2014-03-31 05:43:03
【问题描述】:

我有这个 JayData 查询(可以在 JSLQ playground 查到):

northwind.Products
  .filter( function( product ) {
    return  product.ProductName.toLowerCase() in ['tofu'];
  } )
  .toArray( function( products ) {
    console.dir( products );
  } );

由于某些未知原因,此查询产生了不正确的过滤器表达式: http://services.odata.org/Northwind/Northwind.svc/Products?$filter=(tolowerProductName%20eq%20%27tofu%27)&$callback=parent.handleJSONP_21&$format=json

我在上面用粗体突出了不正确的参数。

所以你可以看到我们有tolowerProductName,但它应该是tolower(ProductName),所以正确的过滤查询应该是这样的: http://services.odata.org/Northwind/Northwind.svc/Products?$filter=%28tolower%28ProductName%29%20eq%20%27tofu%27%29&$callback=parent.handleJSONP_21&$format=json

有人知道解决方法吗?

更新: 仅当我将 toLowerCase 与“in [array]”一起使用时才会出现问题,因此例如此查询工作正常:

northwind.Products
  .filter( function( product ) {
    return  product.ProductName in ['Tofu'];
  } )
  .toArray( function( products ) {
    console.dir( products );
  } );

这个带有 toLowerCase 的查询也可以正常工作:

northwind.Products
  .filter( function( product ) {
    return  product.ProductName.toLowerCase() == 'Tofu';
  } )
  .toArray( function( products ) {
    console.dir( products );
  } );

谢谢!

【问题讨论】:

    标签: javascript odata jaydata


    【解决方案1】:

    您是否尝试过将该表达式设置为一个变量,然后在 ['tofu'] 中进行检查?

    【讨论】:

    • 在没有 toLowerCase 的情况下工作得很好,例如northwind.Products .filter( function( product ) { return product.ProductName in ['Tofu']; } ) .toArray( function( products ) { console.dir( products ); } );
    • product.ProductName 是字符串吗?您是否尝试将 product.ProductName.toLowerCase() 包装在括号中?
    • 你能告诉我一个如何将表达式设置为变量的例子吗?谢谢!
    • var productName = product.ProductName.toLowerCase();
    • 然后,在['tofu']中返回productName
    【解决方案2】:

    我发现不正确的过滤器表达式产生了这行代码(用于使用'in'运算符的查询):

    context.data = temp + context.data.replace(/\(/g, '').replace(/\)/g, '');
    

    Line 1542 in oDataProvider.js

    我用这个代码替换了它:

    context.data = temp + context.data;
    

    现在一切都按预期进行。也许我在此修复程序中引入了其他问题,但至少它对我的查询按预期工作。

    所以 VisitSimpleBinaryExpression 函数现在看起来像这样:

    VisitSimpleBinaryExpression: function (expression, context) {
            context.data += "(";
            //TODO refactor!!!
            if (expression.nodeType == "in") {
                Guard.requireType("expression.right", expression.type, $data.Expressions.ConstantExpression);
                var paramValue = expression.right.value;
                if (!paramValue instanceof Array) { Guard.raise(new Exception("Right to the 'in' operator must be an array value")); }
                var result = null;
                var orResolution = { mapTo: "or", dataType: "boolean", name: "or" };
                var eqResolution = { mapTo: "eq", dataType: "boolean", name: "equal" };
    
                paramValue.forEach(function (item) {
                    var idValue = item;
                    var idCheck = Container.createSimpleBinaryExpression(expression.left, idValue,
                        $data.Expressions.ExpressionType.Equal, "==", "boolean", eqResolution);
                    if (result) {
                        result = Container.createSimpleBinaryExpression(result, idCheck,
                        $data.Expressions.ExpressionType.Or, "||", "boolean", orResolution);
                    } else {
                        result = idCheck;
                    };
                });
                var temp = context.data;
                context.data = '';
                this.Visit(result, context);
                //context.data = temp + context.data.replace(/\(/g, '').replace(/\)/g, '');
                context.data = temp + context.data;
            } else {
                this.Visit(expression.left, context);
                context.data += " ";
                context.data += expression.resolution.mapTo;
                context.data += " ";
                this.Visit(expression.right, context);
            };
            context.data += ")";
    
        },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多