使用 toLowerSay 筛选一组值的导航属性
Filtering on navigation properties for a set of value with toLowerCase
我有这个JayData查询(可以在JSLQ操场上检查):
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 );
} );
谢谢!
您是否尝试过将该表达式设置为变量,然后在['豆腐']中检查它?
我发现不正确的过滤器表达式会产生以下代码行(对于带有"in"运算符的查询):
context.data = temp + context.data.replace(/'(/g, '').replace(/')/g, '');
oDataProvider 中的第 1542 行.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 += ")";
},
- fluxxor向一个flux实例添加一组以上的操作
- 我们怎样才能将内含子J用于一组特定的元素
- 使用linq.js按当前日期订购一组momentjs日期
- 正则表达式,从一组关键字中获取奇数
- 创建一组元素JointJS
- Bootstrap一页导航Fluid网站最小化问题
- 如何在javascript中获取一组复选框值
- 一组(共组..)
- 使用JS将页面中的每个字母设置为随机颜色.为什么在页面的每个打开标记之前总是有一组额外的span标记
- 在一组复选框中,一次只允许选择一个
- 为什么在fabricjs中可选择的不适用于一组圆
- 如何在不刷新页面的情况下每次单击一组选项卡时刷新视图内容窗格
- 从一组具有相同起始和结束的所有段落的段落中提取包含特定字符串的段落
- 简单的Javascript文本编辑器或一组函数
- 基于日期范围的一组日期范围内的天数
- 处理对象数组并将它们以 4 个为一组进行分配
- 如何在 Javascript 中用一组字符拆分子字符串上的字符串
- 使一组对象与 jQuery 一起拖动
- 避免整个页面重新加载(!?),而导航只更新相关的部分在一组网页
- 使用 toLowerSay 筛选一组值的导航属性