【问题标题】:How can I compare a number which was saved as a string in a database to an integer field?如何将在数据库中保存为字符串的数字与整数字段进行比较?
【发布时间】:2021-06-09 08:46:14
【问题描述】:

我试过这行代码,但遇到了错误

CMR cmr = _cmrServices.GetAllWithAll().Where(x => x.CMRSerial == cmrSearchDeliverySerialNumber).FirstOrDefault();
Inner Exception 1:
SqlException: Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

Inner Exception 2:
Win32Exception: The wait operation timed out

我无法在数据库中将字段的类型更改为整数,也无法将我的值与数字字符串进行比较,因为它会出现超时错误。

但如您所见,它们是字符串类型的数字。

cmrSearchDeliverySerialNumber 这个字段虽然是字符串,但无论它是什么类型,我都无法将CMRSerial 字段过滤为整数。

我不知道应该使用 SqlFunctions.StringConvert 还是其他东西来将 CMRSerial` 转换为整数。

很遗憾,我无法在 CMRSerial 字段上设置索引,因为它的类型是 nvarchar(max),我无法将它作为字符串与另一个字符串进行比较。

我在执行探查器创建的查询后运行了这行代码

SELECT QP.query_plan as [Query Plan], 
       ST.text AS [Query Text]
FROM sys.dm_exec_requests AS R
   CROSS APPLY sys.dm_exec_query_plan(R.plan_handle) AS QP
   CROSS APPLY sys.dm_exec_sql_text(R.plan_handle) ST;

【问题讨论】:

  • 这个已经回答了:stackoverflow.com/questions/8602395/…
  • 在CMRSerial上放一个索引
  • @JamesBlackburn 我的问题不是超时。它正在转换
  • 你正在做一个隐式转换,这在性能方面真的很糟糕。我会建议做一个明确的转换/转换,然后comapre它。根据经验,如果它看起来像整数但不是,并且您想比较它,请先转换它(但要告别该列上的任何索引)
  • @GertArnold 我刚刚问了关于在 linq 中将字符串字段转换为整数的问题。

标签: c# linq lambda


【解决方案1】:

在 c# 代码中将搜索值转换为字符串,然后将其与数据库值进行比较(与转换数据库中的值相比),性能会更高。虽然这只有在数据库中的字符串值以一致的格式生成时才有效。

var serialSearchValue = cmrSearchDeliverySerialNumber.ToString(System.Globalization.CultureInfo.InvariantCulture) 并在 LINQ 查询中使用它。

【讨论】:

  • 默认是字符串,为什么要再做一次?!
  • 如果两者都是字符串,那么您的问题与字符串与数字无关 - 只是缺少索引很可能正如其他 cmets 所建议的那样。
  • 你认为我想将 linq 中的字段转换为整数,我该怎么办?
  • 如问题所述:此字段 cmrSearchDeliverySerialNumber 是字符串。 @amirkian您当然不想在过滤之前将数据库字段转换为整数,这肯定会降低性能。我怀疑这里发生的是内部 nvarchar/varchar 转换,它应该在查询计划中可见。
  • @GertArnold 在这种情况下,我想在过滤 linq 表达式之前将数据库字段转换为整数。
猜你喜欢
  • 2016-01-16
  • 1970-01-01
  • 2021-08-10
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多