2010-03-17 43 views
0

我在LINQ中看到了很多例子,但我无法在vb.net中重现相同的结果。随机排序列表与LINQ和实体框架

我有下面的代码:

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() 

但是结合该列表控制时,我收到一个错误。

LINQ实体无法识别 方法“的Int32下一页()”方法,和 这种方法不能被翻译成 商店表达。

任何有关如何使这项工作的建议?

回答

2

您不能在查询中使用Random对象,因为对象存在于您的VB代码中,而不是数据库中。

首先获得结果到列表中,然后对其进行加扰。它更有效地使用加扰算法像费 - 耶茨/克努特不是一个随机值排序:

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 

此外,为你排序的随机值要么必须知道排序算法永远不会重新评估两个给定项目之间的关系,或者您必须为每个项目分配一个随机值,以便在整个排序过程中使用相同的值。如果您尝试的方法是可能的,那么您可能会得到与browser choise页面相同的错误结果。