C# OData 4客户端和带浮点数的筛选器
我们使用创建一些代理类并查询OData4服务。一切似乎都很正常,除了我们希望按浮点或双精度属性过滤的查询 因此,对于使用整数筛选器进行的给定查询:C# OData 4客户端和带浮点数的筛选器,c#,linq,odata,C#,Linq,Odata,我们使用创建一些代理类并查询OData4服务。一切似乎都很正常,除了我们希望按浮点或双精度属性过滤的查询 因此,对于使用整数筛选器进行的给定查询: var ctx=新ODataClient(新Uri(“http://...")); var-intFilter=3; var results=ctx.Entities.Where(e=>e.IntProperty==intFilter.ToList(); 对服务的查询结果为: Entities?$filter=IntProperty eq 3 我
var ctx=新ODataClient(新Uri(“http://..."));
var-intFilter=3;
var results=ctx.Entities.Where(e=>e.IntProperty==intFilter.ToList();
对服务的查询结果为:
Entities?$filter=IntProperty eq 3
我们得到了预期的过滤结果
但如果我们尝试使用双值进行筛选,例如:
var ctx=新ODataClient(新Uri(“http://..."));
var双滤波器=0.35d;
var results=ctx.Entities.Where(e=>e.DoubleProperty==doubleFilter.ToList();
最终生成的查询为:
Entities?$filter=DoubleProperty eq 0.35
实际上,它应该是:
Entities?$filter=DoubleProperty eq 0.35d
最后的微小差异会导致服务引发异常begin:
The query specified in the URI is not valid.
Numeric string '0.35' is not a valid Int32/Int64/Double/Decimal.
有没有办法配置这些代理客户端来正确地进行转换?还是我们一直使用AddQueryOption方法,不得不“手动”而不是使用LINQ构建过滤器?不要像这样发送它
var doubleFilter = 0.35d;
decimal doubleFilter = 0.35;
而是像这样发送
var doubleFilter = 0.35d;
decimal doubleFilter = 0.35;
这将解决您的问题
实体?$filter=DoubleProperty eq 0.35
实际上是一个预期的表达式,如果您查看
基元文字可以作为键属性值出现在资源路径中,也可以作为$filter表达式中的操作数出现在查询部分中。它们根据[OData ABNF]中的原语文字规则表示
并定义原语文本
,如下所示:
);在URL中
primitiveLiteral = nullValue ; plain values up to int64Value
/ ...
/ doubleValue
/ singleValue
/ ...
decimalValue = [SIGN] 1*DIGIT ["." 1*DIGIT]
doubleValue = decimalValue [ "e" [SIGN] 1*DIGIT ] / nanInfinity ; IEEE 754 binary64 floating-point number (15-17 decimal digits)
singleValue = doubleValue
因此,我认为最好将您的服务支持提升0.35倍
要解决这个问题,实际上可以使用AddQueryOption
,如下所示
ctx.Entities.AddQueryOption("$filter", "DoubleProperty eq 0.35d").ToList();
我不能这样做,因为我要筛选的属性是双精度的,而不是字符串。如果我尝试,我会得到一个类型不匹配的异常:“检测到一个具有不兼容类型的二进制运算符。找到了运算符种类“Equals”的操作数类型“Edm.Double”和“Edm.String”。“谢谢您的输入。不过,我确实遇到了同样的问题,但问题得到了修复,修复方式与我的回答相同,我将再次尝试检查我的代码,我会更新我的答案或删除它我已经检查了我的代码,这正是我的情况,你能试试让我知道吗