【发布时间】:2017-09-29 22:04:19
【问题描述】:
我有一个场景,我在 c# 中有字符串值,而在 SQL Server 中,数据类型是十进制,并且要求我必须像在字符串中那样过滤值,其中包括(startswith、endswith、contains 等)过滤器。我正在尝试这样:
customers = customers.Where(x => Convert.ToString(x.CrmCustomerNumber).Contains(value));
但它给了我错误,因为您不能在 IQuerable 中使用 Convert.tostring。我知道我可以做到这一点
customers.ToList().Where(x => Convert.ToString(x.CrmCustomerNumber).Contains(value));
但我在应用所有过滤器后最后执行 Customer.ToList()。我的问题有什么解决办法吗?
【问题讨论】:
-
为什么要进行这样的比较呢?只需将字符串值解析为十进制并与数据进行比较。无论如何,您可能误解了要求 - 没有人要求您使用最慢的方式来查询数据。他们很可能要求您避免浮点不确定性。使用
System.Decimal并在 SQL 命令参数中指定正确的小数位数和精度即可解决此问题 -
@PanagiotisKanavos,可能是这样,或者它确实可能是一项启用查询的任务,例如“给我们所有在我们的 CRM 中 ID 以'123'开头或 ID 包含'567'的客户” .对我来说看起来很奇怪,但肯定有可能。在这种情况下,OP 要求的是有效的东西。
-
@Anrei 不适用于
startswith。当范围查询使用主键时,这仍然会强制进行全表扫描。此外,这需要 integer 或 bigint,而不是小数。无论真正的需求是什么,都可以在不诉诸全表扫描的情况下处理它 -
@Imranbutt 您的实际 问题是什么?为什么您认为需要
LIKE '%123%的等效项来解决问题?可能还有另一种方法可以做到这一点 -
@Andrei 或者它可能是一个更严重的问题,例如 CSV 字段而不是
many-to-many关系。在这种情况下,重新设计架构将解决问题并提高性能
标签: c# asp.net sql-server linq linq-to-entities