Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lambda LINQ语句中的C#Convert.ToDouble(值)_C#_Linq - Fatal编程技术网

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

Lambda LINQ语句中的C#Convert.ToDouble(值),c#,linq,C#,Linq,我有以下LINQ声明: Items = Items.Where(p => p.LeadDatas.Any( q => q.LeadField.Name == descriptor.Name && Convert.ToDouble(q.Value) == Convert.ToDouble(value))); q.Valu

我有以下LINQ声明:

Items = Items.Where(p => p.LeadDatas.Any(
                         q =>
                         q.LeadField.Name == descriptor.Name &&
                         Convert.ToDouble(q.Value) == Convert.ToDouble(value)));
q.Value
是一个双精度的字符串值,
Value
也是一个双精度的字符串值,这两个值都需要转换为双精度,以便进行相等性比较

当我调试这个LINQ语句时,我得到以下SQLException:

将数据类型varchar转换为float时出错


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

首先,我要将
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));
问题很可能是试图转换
,而不是试图转换某行的
q.value
。或者,可能是您有一行没有有效值。(您可以尝试使用
double.TryParse
,但我不确定这是否有效……)


然而,首先比较二进制浮点值和简单等式通常也是一个坏主意。您可能希望使用某种程度的容差(具体如何使用LINQ to SQL是另一回事……

看起来您正在使用LINQ to SQL。该错误直接来自执行查询的SQL Server(而不是您的代码)。我猜您有一行的值不是有效的数值

我会在SSMS中运行下面的查询,我想您会发现它失败了,并且出现了错误

Error Converting data type varchar to float

select convert(float, value) from leaddata
编辑:

如果您想按照Jon的建议添加一些容错功能,可以映射IsNumeric函数并执行以下操作:

在您的DBML(参考)中


检查您在SQL Server中转换为
float
的字符串值是否有效(例如,它们不是空的或小数点符号有效)

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

很可能是它试图在SQL中执行此操作-这是100%绝对肯定的(请参阅错误消息)@JeffN825:我的观点是,可能是尝试执行“固定”值的转换才是问题所在,而不是试图转换数据库中的数据。为了我自己的教育,为什么比较双打不好?因为古老的“十进制”问题?()double.TryParse在具有LINQ to SQLQ的IQueryable中不起作用只是为了添加更新,我已经验证了数据库中的值,并且数据库中没有具有无效数值的行。我喜欢此解决方案,缺点是,Items是IQueryable,所以我可以访问此函数吗?一旦将其映射到DBML中,它应该在DataContext上生成IsNumeric函数
<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));