[英]C# - Using NumberFormatInfo with Convert.ToDouble to return double
[英]C# Convert.ToDouble(value) in Lambda LINQ Statement
我有以下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
我不知道為什么它不允許我這樣做,但我想知道修復是什么,我需要我的兩個值來比較這里的平等。
首先,我將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是另一回事......)
看起來你正在使用LINQ to SQL。 該錯誤直接來自執行查詢的SQL Server(而不是您的代碼)。 我的猜測是你的某些行的值不是有效的數值。
我會在SSMS中運行以下查詢,我認為你發現它失敗並出現錯誤
Error Converting data type varchar to float
select convert(float, value) from leaddata
編輯:
如果你想像Jon建議的那樣添加一些容錯,你可以映射IsNumeric函數並執行以下操作:
在您的DBML中(參考如何知道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));
檢查您在SQL Server中轉換為float
的字符串值是否有效(例如,它們不是空白或者它們具有小數點的有效符號)。
聽起來其中一個值無法成功轉換為浮點數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.