2009-09-22 34 views
2

我正在使用GridView和LinqDataSource查看Categories表。我將Gridview設置爲啓用排序。除了當我點擊Description列的標題時,排序通常是有效的。 「Linq to SQL錯誤:按表達式排序只能包含非常量標量

」按表達式的順序只能包含服務器可以比較的非常量標量,而類型爲「NText」的表達式不具有順序可比性。

描述是鑄造的ntext,但有人可以向我解釋發生了什麼?爲什麼在nvarchar時NText不可排序?

回答

3

SQL Server just doesn't let you order by NText fields(另請參閱SQL Server Error List中的錯誤420)。我的猜測是出於效率原因,但我無法肯定地說。

現在,鏈接文章中的解決方案被轉換爲nvarchar ......但是在LINQ中這顯然很難做到。

您的描述字段是否必須是ntext

+0

不行。我只是想知道發生了什麼。謝謝瓊!你差不多達到100,000分! – burnt1ce

1

我已經點擊了這個問題十幾次,終於找到了答案。 @ neo的回答是here.

我的例子SQL前:

SELECT * 
FROM [tblRoom] 
WHERE [Building] = <%= bldgdbid %> 
AND [Floor] LIKE CAST('<%= flr %>' AS NVARCHAR(127)) 
ORDER BY CAST([RoomName] AS NVARCHAR(255)) 

我變成這個LINQ查詢:

(From zz In tblRooms 
Where zz.Building = bldgdbid 
Select zz 
).Where(Function(x) Convert.ToString(x.Floor).ToLower() = flr.ToLower() 
).OrderBy(Function(y) Convert.ToString(y.RoomName)) 

其中LINQPad產生:

SELECT [t0].[DBID], [t0].[Building], [t0].[ID], [t0].[Floor], [t0].[RoomName] 
WHERE (LOWER(CONVERT(NVarChar(MAX),[t0].[Floor])) = @p0) AND ([t0].[Building] = @p1) 
ORDER BY CONVERT(NVarChar(MAX),[t0].[RoomName]) 

所以它使用CONVERT不是CAST,但這對我來說已經足夠了!而且,它應該足夠好,因爲CAST是ANSI,而CONVERT是SQL Server特有的,但功能更強大。

它看起來馬虎,但我正在轉向實體框架和所有的LINQ更容易。