我有以下LINQ语句:
Items = Items.Where(p => p.LeadDatas.Any(
q =>
q.LeadField.Name == descriptor.Name &&
Convert.ToDouble(q.Value) == Convert.ToDouble(value)));
q.Value
是double的String值,value
也是double的String值,这两者都需要转换为double,以便可以比较它们的相等性。
当我调试这个LINQ语句时,我得到以下SQLException:
将数据类型varchar转换为float
时出错
我不确定为什么它不允许我这样做,但我想知道修复是什么,我需要在这里比较两个值是否相等。
答案 0 :(得分:7)
首先,我将Convert.ToDouble(value)
提取到局部变量:
double target = Convert.ToDouble(value);
Items = Items.Where(p => p.LeadDatas.Any(q =>
q.LeadField.Name == descriptor.Name &&
Convert.ToDouble(q.Value) == target));
尝试转换value
很可能是问题所在,而不是试图转换q.Value
某行。或者,可能是您有一行没有有效值。 (你可以尝试使用double.TryParse
,但我不确定这种工作有多好......)
然而,首先将二进制浮点值与简单相等进行比较通常是 。您可能希望使用某种程度的容差(并且确切地说,如何使用LINQ to SQL是另一回事......)
答案 1 :(得分:0)
看起来你正在使用LINQ to SQL。该错误直接来自执行查询的SQL Server(而不是您的代码)。我的猜测是你的某些行的值不是有效的数值。
我会在SSMS中运行以下查询,我认为你发现它失败并出现错误
Error Converting data type varchar to float
select convert(float, value) from leaddata
编辑:
如果你想像Jon建议的那样添加一些容错,你可以映射IsNumeric函数并执行以下操作:
在您的DBML(参考How to know if a field is numeric in Linq To SQL)
中<Function Name="ISNUMERIC" IsComposable="true">
<Parameter Name="Expression" Parameter="Expression" Type="System.String" DbType="NVarChar(4000)" />
<Return Type="System.Boolean" DbType="BIT NOT NULL"/>
</Function>
在您的代码中:
double target = Convert.ToDouble(value);
Items = Items.Where(p => p.LeadDatas.Where(i => myDataContext.IsNumeric(i)).Any(q =>
q.LeadField.Name == descriptor.Name &&
Convert.ToDouble(q.Value) == target));
答案 2 :(得分:0)
检查您在SQL Server中转换为float
的字符串值是否有效(例如,它们不是空白或者它们具有小数点的有效符号)。
答案 3 :(得分:0)
听起来其中一个值无法成功转换为浮点数。