我正在使用LINQ to Entities,我正在创建一个可以在动态标记上的通用类" 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",则不会返回任何结果。我需要做的是通过在查询数据库时将小数位数限制为2来进行比较,并将其与用户输入的十进制值进行比较,如下所示:
var data = db.Products;
var query = String.Format("Decimal.Round({0}, 2).Equals(@0)", filter.property);
data = data.Where(query, filter.value);
where" filter.property"是列/字段名称," filter.value"包含小数值。
但是,这会引发运行时错误:
类型' System.ArgumentException'的例外情况发生在System.Core.dll中但未在用户代码中处理
其他信息:参数类型不匹配
我似乎无法找到许多基于字符串的LINQ Where例子涉及十进制数或数字格式的正确例子。
对于如何使这项工作有任何建议吗?作为最后的手段,我可以从表中恢复所有数据,在内存中适当地格式化十进制数,然后最后将Where子句添加到内存中的结果集,但这对资源来说会更重。当然,有一种方法可以使用LINQ to Entities动态执行此操作吗?
提前致谢。
答案 0 :(得分:0)
使用范围检查更容易,范围是过滤值+/- 0.005:
10.305 < value <= 10.315
以这种方式执行此操作也更好,因为如果首先对数据库值进行舍入,则查询优化器不能再使用索引。搜索不是sargable。