2011-08-30 111 views
6

我有以下LINQ聲明:C#Convert.ToDouble(值)LAMBDA 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浮動

我不知道爲什麼它是不是讓我做這,但我想知道什麼是修復,我需要我的兩個值在這裏進行比較平等。

回答

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的工作方式是另一回事......)

+0

它試圖在SQL中執行它非常有可能 - 它完全肯定是100%(請參閱錯誤消息) – Jeff

+0

@ JeffN825:我的觀點是可能試圖執行「固定」值的轉換是問題,而不是嘗試轉換數據庫中的數據。將編輯澄清。 –

+0

對於我自己的教育,爲什麼比較雙打不好?由於陳舊的「小數」問題? (http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) – Jeff

0

看起來您正在使用LINQ to SQL。該錯誤直接來自SQL Server執行查詢(而不是您的代碼)。我的猜測是,你有一些行的值不是有效的數值。

我會跑在SSMS以下查詢,我覺得你發現它失敗,錯誤

Error Converting data type varchar to float 

select convert(float, value) from leaddata 

編輯:

如果你想添加一些容錯能力喬恩建議,你可以映射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)); 
+0

我喜歡這個解決方案,缺點是,項目是一個IQueryable 所以我可以訪問這個功能? – TheJediCowboy

+0

將其映射到DBML中後,它應該在DataContext上生成IsNumeric函數。 – Jeff

+0

如果你想聲明它完全獨立於你的DataContext,添加到DBML,但映射到像這裏的靜態方法http://msdn.microsoft.com/en-us/library/bb386973.aspx – Jeff

0

檢查地看到,要轉換爲float SQL Server中的字符串值是有效的(例如,他們不爲空或他們有小數點的有效符號)。

0

聽起來像其中一個值不能成功轉換爲浮點數。