【问题标题】:how to cast with eq in odata filtering?如何在 odata 过滤中使用 eq 进行投射?
【发布时间】:2013-10-12 20:51:16
【问题描述】:

我想通过用户交互在 odata 查询中设置过滤器。当用户选择一个数据属性时,我已经知道它的类型。例如,如果用户想要使用等于某个数字的 SALE_PRICE 进行过滤,我已经知道所选属性的类型为 Edm.Decimal。所以我尝试使用这个事实并使用强制转换操作构建查询。例如,要获取 SALE_PRICE 等于 323.7 的数据,我创建以下 URI:

analyticView?$select=AMOUNT_SOLD,FAMILY_NAME&$filter=SALE_PRICE+eq+(cast(323.7,'Edm.Decimal'))&$format=json

但我收到一条错误消息:

"No property 'cast' exists in type 

我也在 serivces.odata.org API 上试过这个,但它似乎不起作用

http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$select=Freight,OrderID&$filter=OrderDate+eq+(cast(1996-07-05T00:00:00,'Edm.DateTime'))&$top=5&$format=json

你能检查一下有什么问题吗

【问题讨论】:

    标签: odata


    【解决方案1】:

    为什么需要演员表?你可以试试这个查询,

    analyticView?$select=AMOUNT_SOLD,FAMILY_NAME&$filter=SALE_PRICE eq 323.7M&$format=json
    

    你可以用 m|M 后缀来表示decimals,比如 3.27M

    【讨论】:

    • 感谢您的回复,其实这就是我目前正在做的事情。但是,过滤器是由用户交互定义的,有时它们可​​以是小数,有时它们可​​以是字符串、整数或日期时间(或 OData 支持的任何其他类型),获取数据类型的唯一时间是读取元数据。所以我们的想法是用它们的类型注册属性并将其用于过滤!
    • 这就是我一直在寻找的。希望我能以某种方式给你买啤酒。
    【解决方案2】:

    "1996-07-05T00:00:00" 不是格式良好的日期时间常量,它应该是 "datetime'1996-07-05T00:00:00'" 那么这个查询有效:http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$ select=Freight,OrderID&$filter=OrderDate+eq+(cast(datetime'1996-07-05T00:00:00','Edm.DateTime'))&$top=5&$format=json

    不确定为什么您的 analyticView 请求出错。如果您能分享有关模型和错误消息的更多详细信息,那就太好了。

    【讨论】:

    • 但这意味着我必须再次对值进行一些格式化,例如将日期时间添加到“1996-07-05T00:00:00”或将 M 添加到 323.7。难道没有办法,图书馆......可以根据 Edm 类型做到这一点吗?
    • cast 函数类似于 .net/java 中的强制转换,可以将值强制转换为相似类型或派生/基本实体类型,例如(double)12,或 (decimal)OrderID,(Employee)person。但不支持将类型(如字符串)转换为不同的类型(如浮点/双精度)。
    • cast 不是我想要的,我正在寻找一种方法来根据 Edm 类型准备过滤器,例如如果我有 '1996-07-05T00:00:00' Edm.DateTime 库/解决方案将对值进行格式化以给出日期时间'1996-07-05T00:00:00'。有没有这样的解决方案?
    • OData 确实提供了编写服务器端功能的灵活性,但它不是免费提供的。因此,我建议您编写客户端代码来进行格式化,而不是编写服务器端函数(假设您已经有了这些值),总体成本应该低于公开和调用服务器端函数。
    【解决方案3】:

    为了解决这个问题,我创建了这个handler

    //How to use 
     var test = odataHanlder.odataFilter();
    
    //how to extend with new handler 
    test.addFilterHandler("Edm.Int16", function(_value){
    return _value;
    });
    
    //how to prepare filter on the fly 
    console.log(test.prepareFilter("Edm.DateTime","1996-07-04T00:00:00"));
    //result >> datetime'1996-07-04T00:00:00' 
    

    你可以找到更详细的描述here

    欢迎反馈!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2012-08-30
      • 2013-09-25
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多