2013-05-03 108 views
0

我試圖用這個代碼來獲得在我的數據庫中的字段的最大數量:如何獲得最大數量?

var bb=(from c in Office_TBLs select c.CodeNumber).Max(); 

當我運行的查詢我收到的結果「999」,這是錯誤的,因爲在DATABSE最大數量爲1601.數據庫領域中的數據類型是否爲Nvarchar?

我該如何解決我的代碼才能獲得正確的最大數量。

+0

是否使用實體框架,因爲你可能需要使用[SqlFunctions.StringConvert(http://msdn.microsoft.com/en-us/library/dd487158.aspx)方法 – Habib 2013-05-03 04:43:02

+0

LINQ到SQL或LINQ實體或...? – 2013-05-03 04:43:43

+0

我正在使用Linq To Sql。感謝 – JayJay 2013-05-03 04:44:43

回答

3

由於您使用LINQ到SQL,你應該使用Convert.ToInt32轉換爲字符串到數字,讓您的查詢將是:

var bb =(from c in Office_TBLs select Convert.ToInt32(c.CodeNumber)).Max(); 

參見:Standard Query Operator Translation

C#強制類型轉換隻能在支持投影。在其他地方使用 的演員不會被翻譯並被忽略。 除了SQL 函數名稱,SQL實際上只執行與通用 語言運行庫(CLR)等效的轉換。也就是說,SQL可以將 一個類型的值更改爲另一個類型。沒有等效的CLR投射,因爲 不是重新解釋與另一個 類型相同的比特的概念。這就是爲什麼C#只能在本地工作。它不是遠程的。

+2

+1不要以爲'int.Parse()'可以在Linq to Entities或Linq to SQL中工作,所以這應該是解決方案。 – 2013-05-03 04:48:42

+0

@Joachim Isaksson是的你的權利,並感謝您的支持! – JayJay 2013-05-03 04:51:33

12

"999" > "1601"作爲字符串比較 - 所以得到你想要的結果你需要將字符串值轉換爲數字。

最簡單的方法是使用.Select(s => int.Parse(s)).Max())(或.Max(s => int.Parse(s)))而不是.Max(),最終使用常規字符串比較。

請注意,根據數據來自何處,可能有更好的方法來獲取整數結果(包括更改數據庫中的字段類型)。在查詢最有可能的強制查詢上使用.Select來返回數據庫中的所有行,並且僅返回內存中的計算最大值。

0

如果使用NVarChar然後你問有按字母順序排列的值試試這個

var bb=(from c in Office_TBLs select (e => e.CodeNumber).Max()) 
0

。 「999」就像「ZZZ」之後的「1601」出現在「HUGS」之後。

如果該列應該只包含數值,那麼最好的解決方法是將數據類型更改爲更合適的選擇。