动态 LINQ to Entities "where" 子句中的小数格式

Formatting of decimals in dynamic LINQ to Entities "where" clause

我正在使用 LINQ to Entities,我正在创建一个通用的 class,它可以根据用户想要在应用程序中搜索的字段在动态“Where”子句上标记查询。

这可用于我数据库中的任何 类型的实体,因此我使用基于字符串的 Where 子句。

通过使用 System.Linq.Dynamic,我得到了一些基本的示例,例如

字符串字段包含:

var data = db.Products;
var query = String.Format("{0}.Contains(@0)", filter.property);
data = data.Where(query, filter.value);

数字字段大于:

var data = db.Products;
var query = String.Format("{0} > @0", filter.property);
data = data.Where(query, filter.value);

这些例子都很好用。

我现在需要创建一个“等于”的小数,但问题是数据库中的货币值可能是 10.3125,但它在应用 UI 中显示为 10.31,所以如果用户想要限制价格等于“10.31”的地方,将不会返回任何结果。我需要做的是通过在查询数据库时将小数位数限制为两位来执行比较,并将其与用户输入的十进制值进行比较,如下所示:

var data = db.Products;
var query = String.Format("Decimal.Round({0}, 2).Equals(@0)", filter.property);
data = data.Where(query, filter.value);

其中“filter.property”是column/field名称,“filter.value”包含十进制值。

但是,这会引发运行时错误:

An exception of type 'System.ArgumentException' occurred in System.Core.dll but was not handled in user code

Additional information: Argument types do not match

我似乎找不到很多基于字符串的 LINQ Where 子句涉及十进制数字或数字格式的例子。

关于如何让它工作有什么建议吗?作为最后的手段,我可​​以从 table 中取回所有数据,在内存中适当地格式化十进制数字,然后最后将 Where 子句添加到内存中的结果集中,但这会增加很多负担资源。肯定有一种方法可以使用 LINQ to Entities 动态执行此操作吗?

提前致谢。

使用范围检查更容易,范围是过滤值 +/- 0.005:

10.305 < value <= 10.315

这样做也更好,因为如果先对数据库值进行四舍五入,查询优化器就不能再使用索引了。搜索不是 sargable