2015-10-04 96 views
2

在我的SQL表中,我有一個string數據類型的版本列,其中包含典型的版本值,如'1.0.0'和'2.0.2'等等。在Linq to Sql查詢中比較兩個包含多個點的字符串

我想編寫一個查詢,檢索版本低於/大於指定版本的所有記錄。

例如,假設我的表是這樣的:

    ====MY TABLE==== 
    version   column2  column3 , .... 
_________________________________________________ 
    2.0.6    ...   ...  ... 
    2.0.5    ...   ...  ... 
    2.0.4    ...   ...  ... 
    2.0.3    ...   ...  ... 

現在我想用version低,等於2.0.5

我的主要問題檢索所有的記錄是輸入( 2.0.5在這種情況下)和version列值都是字符串。所以他們無法正常比較。

我已經試過:

from o in MyTable.Where(w=> float.Parse(w.version) <= float.Parse(inputVersion)) 
/* Other codes ommited for clarity */ 

但很明顯,它拋出一個異常,因爲2.0.3不是浮動。

有一個method比較兩個版本字符串,但因爲它拋出一個異常,說我不能使用它LINQ2SQL查詢中

「方法X沒有支持轉換爲SQL。」

此外,我已經試過:

from o in MyTable.Where(w=> Version.Parse(w.version) <= Version.Parse(inputVersion)) 
/* Other codes ommited for clarity */ 

但它拋出同樣的異常也是如此。

所以我的問題是我怎麼能比較這些值內linq到sql查詢?

+0

Version.Parse沒有翻譯成SQL - 簡單地使用'Replace'功能來做到這一點。 – CSL

回答

1

您可以使用ReplaceConvert.ToInt32(),這些將在Linq2Sql中進行翻譯,這樣可以節省您不必先裝載整個表格,然後再進行處理。

這個查詢將在數據庫中直接執行並返回只匹配數據:

var matchingResults = from o in MyTable.Where(w=> Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));

+0

如果版本沒有相同的編號,則這不起作用。防爆。 7.5.2.66 vs 8.0.1.2 - 比較75266 vs 8012。 – Kipotlov

1

首先,我們需要用空字符串替換.,然後將其削減至Float

var allVersions = MyTable.ToList(); 
var filter = from o in allVersions 
    .Where(w => Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', ''))); 

(我一直使用Entity Framework和這樣的東西的作品在EF只與一些Canonical Functions幫助。所以我告訴你要獲得所有的數據,然後過濾到應用程序內存中,但是直接在Linq to SQL中檢查這個查詢是值得的,因爲經過對谷歌的一些調查,Linq支持轉換數據類型和替換操作到Sql)。

更新:

我沒有用LinqToSQL,但是這個代碼也可以在數據庫中運行,所以不要忘記檢查也沒有檢索所有提交的數據:

var filter = from o in MyTable 
    .Where(w => Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', ''))); 
+0

如果桌子有1000萬行呢?我絕對不會加載整個表格,然後在應用程序中處理它們。 – CSL

+1

謝謝@FarhadJabiyev,首先加載整個表格然後過濾它是一個選項,並且對於小表格可以很好地工作,但是如果有一種方法可以直接提取記錄,那麼它就是這樣。我測試了你的更新後的代碼,但是在LinqToSql查詢裏面看起來像'float.Parse()'拋出一個異常:'Method'Single Parse(System.String)'沒有支持到SQL的轉換。'Convert.ToInt32()'沿着方'替換'運作良好。 – Sobhan

+1

@Sobhan謝謝,我也很高興你標記了其他答案。因爲我不知道'float.parse'不支持。正如我告訴我,我不使用Linq到SQL很多。 –