2010-03-17 9 views
0

J'ai vu beaucoup d'exemples dans LINQ mais je ne suis pas capable de reproduire le même résultat dans vb.net.Liste de tri aléatoire avec LINQ et Entity Framework

J'ai le code suivant:

Dim context As New MyModel.Entities() 

Dim rnd As New System.Random() 

Dim gardens As List(Of Tuin) = (From t In context.Gardens Where _ 
             t.Approved = True And _ 
             Not t.Famous = True _ 
             Order By rnd.Next() _ 
             Select t).ToList() 

Mais je reçois une erreur lors de la liaison de cette liste à un contrôle.

LINQ to Entities ne reconnaît pas la méthode « Int32 suivante() » méthode et cette méthode ne peut pas être traduit en une expression de magasin.

Une suggestion sur comment faire pour que cela fonctionne?

Répondre

2

Vous ne pouvez pas utiliser un objet aléatoire dans la requête comme cela, car l'objet existe dans votre code VB, pas dans la base de données.

Obtenez d'abord le résultat dans une liste, puis brouillez-le. Il est beaucoup plus efficace d'utiliser un algorithme de brouillage comme Fischer-Yates/Knuth que le tri sur une valeur aléatoire:

Dim rnd as New Random() 
For i As Integer = gardens.Count To 2 Step -1 
    Dim pos As Integer = rnd.Next(i) 
    Dim x = gardens(i - 1) 
    gardens(i - 1) = gardens(pos) 
    gardens(pos) = x 
Next 

En outre, pour trier une valeur aléatoire soit vous devez savoir que l'algorithme de tri ne sera plus jamais réévaluer la relation entre deux éléments donnés, ou vous devez attribuer une valeur aléatoire à chaque élément afin qu'il utilise la même valeur tout au long du tri. Si la méthode que vous avez essayée aurait été possible, vous auriez pu obtenir le même mauvais résultat que pour la page browser choise.