2010-07-21 32 views
0

J'ai trouvé que Entity SQL supporte NEWID(), mais ObjectQuery le supporte-t-il aussi? http://msdn.microsoft.com/en-us/library/bb738616.aspx,Est-ce que ObjectQuery.OrderBy() peut utiliser NEWID()?

Puis-je écrire objectquery comme:

context.member.orderby ("NEWID()") select ("it.UserID");.

ou quelque chose comme ça? ou je devrais écrire d'une autre manière?

Je pensais que si l'entité SQL prenait en charge la fonction NEWID(), elle devrait également être acceptée par ObjectQuery. Comme vous pouvez utiliser distinct (it.UserID) ou BitWiseAND (it.UserID, 1) dans ObjectQuery.Where() ou Select().

Merci beaucoup.

Répondre

0

C'est une fonction canonique SQL spécifique au serveur, il devrait donc être préfixées avec SqlServer ':

context.member.orderby("SqlServer.NEWID()").select("it.UserID");

Malheureusement, cela ne fonctionnera pas non plus: le cas où la méthode d'extension a besoin d'au moins une référence à la portée d'entrée immédiate.

0

Merci Devart pour la réponse.

En fait, je trouve que je peux utiliser comme:.

var query1 = context.member.select ("it.userid, SqlServer.NEWID() comme newid") orderby ("it.newid") ;

cela peut faire un ordre aléatoire pour le résultat, vous trouverez que NEWID() est dans la requête SQL traduite.

mais si vous voulez sélectionner résultat en partie de jeu de résultats 'de query1', vous ne pouvez pas écrire:

var query2 = context.member.select ("it.userid, SqlServer.NEWID() comme newid ") .orderby (" it.newid "). select (" it.userid "); Parce que lorsque vous utilisez sql profiler pour regarder le sql qui a été traduit en SQL Server, vous verrez que le 'NEWID() disparaît.

Cependant, je pense que 'query2' devrait être logique. Mais ça ne marche pas.

+0

En fait, c'est une situation attendue. Il existe un article (http://msdn.microsoft.com/en-us/library/bb896273.aspx) sur les problèmes connus d'Entity Framework, qui indique que l'EF ne conserve pas l'ordre dans les sous-requêtes. Essayez de matérialiser la requête, puis prenez uniquement les ID. – Devart