2009-09-22 9 views
2

J'utilise GridView et LinqDataSource pour afficher la table Catégories. J'ai mis le Gridview pour activer le tri. Le tri fonctionne généralement sauf lorsque j'ai cliqué sur l'en-tête de la colonne Description.Erreur Linq to SQL: un ordre par expression ne peut contenir que des scalaires non-constants

"Un ordre par expression ne peut contenir que des scalaires non-constants qui sont d'ordre comparable par le serveur.L'expression avec le type 'NText' n'est pas comparable par ordre."

La description est moulée avec ntext mais quelqu'un peut-il m'expliquer ce qui se passe? pourquoi NText n'est pas triable quand nvarchar sont?

Répondre

3

SQL Server just doesn't let you order by NText fields (voir également l'erreur 420 dans le SQL Server Error List). Je suppose que c'est pour des raisons d'efficacité, mais je ne peux pas dire avec certitude.

Maintenant la solution dans l'article lié est castée à nvarchar ... mais c'est évidemment assez difficile à faire dans LINQ.

Votre champ de description doit-il absolument être un ntext?

+0

Non, ce n'est pas le cas. Je voulais juste savoir ce qui se passait. Merci jon! Vous êtes si près d'atteindre 100 000 points! – burnt1ce

1

J'ai cliqué sur cette question une douzaine de fois et j'ai finalement trouvé la réponse. @neo a répondu qu'il here.

Mon exemple SQL avant:

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

que je tournais dans cette requête 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)) 

qui génère 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]) 

il utilise CONVERT pas CAST, mais c'est assez bon pour moi! Et, il devrait être assez bon pour vous parce que CAST est ANSI et CONVERT est spécifique à SQL Server, mais plus puissant.

Il semble négligé comme diable, mais je passe à Entity Framework et tout LINQ est plus facile.