【问题标题】:Compare C# string with Sql Server decimal type将 C# 字符串与 Sql Server 十进制类型进行比较
【发布时间】: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


【解决方案1】:

如果数字的大小是已知的,例如,如果它们都是六位数,那么您可以只查询一个值范围。

示例:我正在查找所有以 123 开头的六位数字。这与说“WHERE Value BETWEEN 123000 AND 123999”相同。所以你可以查询.Where(x => x >= 123000 && x <= 123999)。

如果这些数字的大小不完全一致,但至少有一些实际限制,您可以将其扩展为 .Where(x => x == 123 || (x >= 1230 && x <= 1239) || (x >= 12300 && x <= 12399) || (x >=123000 && x <= 123999)。等等

只要稍微算一下,您就可以对任何数字进行这项工作。 (x >= n * 10 && x <= ((n * 10) + 9))

EndsWith 可以使用模数学来完成。 包含......嗯......你被表扫描困住了。在这种情况下,您可能会认真考虑向表中添加第二个(可能是计算的)列,该列存储与字符串相同的值,然后对该列进行索引。然后,使用新列进行搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2018-10-02
    • 2021-12-11
    • 2020-07-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多