首页 > 解决方案 > LINQ to Entities 中的round double

问题描述

LINQ to entity 不支持 Math.Round 函数(我假设这意味着将 LINQ 与实体框架 dbset 一起使用),但我确实需要在查询中舍入双精度以根据用户输入过滤大量行。

用户输入是点后的 4 位数字,db 中的双精度数可以是任意大小。

有没有办法在查询中四舍五入?

更新:

基本上用户在表格列的过滤器中输入一些数字。可以说这是水果的重量。

因此,例如用户输入重量为 4.2152,该列必须过滤所有重量为 4.21515 或 4.215212 等的水果。

并且在数据库中有很多水果,重量为 4.21514543543643

结果

因此,经过一天的努力,我决定使用范围条件。虽然这不是一个完全的解决方案。如果用户输入 4.2152,则范围过滤条件大于 4.21515。但它会过滤掉 4.215149 值,否则会四舍五入为 4.2152。

问题已解决,但不完全符合需要:(

标签: c#entity-frameworklinq

解决方案


与其尝试对服务器上的数据进行四舍五入,不如尝试使用一些边界。

对于您的示例,您基本上想要所有重量在 4.2152 和 4.2153 之间的水果。

现在,这将取决于您的具体情况,(您是否总是想要 4 位小数的精度?您使用的确切数据类型是什么,等等......),所以确切的算法取决于您。

但它看起来像这样:

double lowerBound = userInput; // 4.2152
double precision = 0.0001; 
double upperBound = userInput + precision;

var query = DbSet<Fruit>.Where(f => lowerBound >= f.Weight && f.Weight < upperBound);

另请记住,浮点运算有时会让您感到惊讶。根据您的用例,这+ 0.0001可能不是您想要的。


推荐阅读