Lambda LINQ语句中的C#Convert.ToDouble(value)

时间:2011-08-30 15:15:38

标签: c# linq

我有以下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

时出错

我不确定为什么它不允许我这样做,但我想知道修复是什么,我需要在这里比较两个值是否相等。

4 个答案:

答案 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)

听起来其中一个值无法成功转换为浮点数。