代码之家  ›  专栏  ›  技术社区  ›  Sander Versluys

带有LINQ和实体框架的随机排序列表

  •  0
  • Sander Versluys  · 技术社区  · 14 年前

    我在linq中看到过很多例子,但是我无法在vb.net中重现相同的结果。

    我有以下代码:

    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 to实体无法识别 方法“int32 next()”方法,以及 此方法无法转换为 存储表达式。

    关于如何让这个工作有什么建议吗?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Guffa    14 年前

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

    先把结果列成一个表,然后把它加扰。使用Fischer Yates/Knuth这样的加扰算法比对随机值进行排序更有效:

    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 页。