簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM