Linq to Entities,随机顺序

c# entity-framework linq-to-entities

如何以随机顺序返回匹配的实体?
要明确这是Entity Framework的东西和LINQ to Entities。

(航空代码)

IEnumerable<MyEntity> results = from en in context.MyEntity
                                where en.type == myTypeVar
                                orderby ?????
                                select en;

谢谢

编辑:
我尝试将其添加到上下文中:

public Guid Random()
{
    return new Guid();
}

并使用此查询:

IEnumerable<MyEntity> results = from en in context.MyEntity
                                where en.type == myTypeVar
                                orderby context.Random()
                                select en;

但我得到了这个错误:

System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Guid Random()' method, and this method cannot be translated into a store expression..

编辑(当前代码):

IEnumerable<MyEntity> results = (from en in context.MyEntity
                                 where en.type == myTypeVar
                                 orderby context.Random()
                                 select en).AsEnumerable();

一般承认的答案

简单的解决方案是创建一个数组(或List<T> ),然后将其索引随机化。

编辑:

static IEnumerable<T> Randomize<T>(this IEnumerable<T> source) {
  var array = source.ToArray();
  // randomize indexes (several approaches are possible)
  return array;
}

编辑:就个人而言,我发现Jon Skeet的答案更优雅:

var results = from ... in ... where ... orderby Guid.NewGuid() select ...

当然,您可以使用随机数生成器而不是Guid.NewGuid()


热门答案

这样做的一个简单方法是通过Guid.NewGuid()进行排序,然后在客户端进行排序。你可能能够说服EF在服务器端做一些随机的事情,但这并不一定简单 - 使用“随机数排序”这样做显然已被打破

要在.NET端而不是在EF中进行排序,您需要AsEnumerable

IEnumerable<MyEntity> results = context.MyEntity
                                       .Where(en => en.type == myTypeVar)
                                       .AsEnumerable()
                                       .OrderBy(en => context.Random());

最好将无序版本放入列表然后随机播放。

Random rnd = ...; // Assume a suitable Random instance
List<MyEntity> results = context.MyEntity
                                .Where(en => en.type == myTypeVar)
                                .ToList();

results.Shuffle(rnd); // Assuming an extension method on List<T>

除了其他任何东西之外,洗牌比排序更有效。有关获取适当的Random实例的详细信息,请参阅我的随机性文章 。 Stack Overflow上有很多Fisher-Yates shuffle实现。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因