Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OData 4客户端和带浮点数的筛选器_C#_Linq_Odata - Fatal编程技术网

C# OData 4客户端和带浮点数的筛选器

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 我

我们使用创建一些代理类并查询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双滤波器=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”。“谢谢您的输入。不过,我确实遇到了同样的问题,但问题得到了修复,修复方式与我的回答相同,我将再次尝试检查我的代码,我会更新我的答案或删除它我已经检查了我的代码,这正是我的情况,你能试试让我知道吗