Linq Orderby随机ThreadSafe用于ASP.NET

时间:2010-07-26 21:38:44

标签: asp.net asp.net-mvc linq s#arp-architecture

我正在使用Asp.net MVC和Sharp Architecture。

我有这段代码:

return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
                .Take(50).ToList();

我如何随机订购? 注意:我不想订购50个提取的商品,我想先订购,然后提取50个商品。

THKS

5 个答案:

答案 0 :(得分:32)

实现高效实现的一种方法是在数据Shuffle中添加一列,该列填充了随机int(创建每条记录时)。

然后,访问该表的查询变为......

Random random = new Random();
int seed = random.Next();
result = result.OrderBy(s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed);

这在数据库中执行XOR操作,并按XOR的结果进行排序。

优点: -

  1. 高效:SQL处理 订购,无需取整 表
  2. 可重复:(适合 测试) - 可以使用相同的随机 种子生成相同的随机 为了
  3. 支持大多数(全部?)实体框架 数据库
  4. 这是我的家庭自动化系统用于随机化播放列表的方法。它每天都会选择一个新的种子,在白天提供一致的顺序(允许轻松的暂停/恢复功能),但每个新的一天都会重新查看每个播放列表。

答案 1 :(得分:2)

您可以按照here所述在T-Sql中执行此操作。我不认为你可以在没有将整个结果集加载到内存中然后将其中的大部分内容丢弃的情况下在linq中执行它,这是你不想做的。

答案 2 :(得分:1)

Random random = new Random();
return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
                .OrderBy(x => r.Next())
                .Take(50).ToList();

答案 3 :(得分:1)

可能最好编写自己的扩展方法来执行此操作。

public static class Extensions
{
    static readonly Random random = new Random();

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> items)
    {
        return Shuffle(items, random);
    }

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> items, Random random)
    {
        // Un-optimized algorithm taken from
        // http://en.wikipedia.org/wiki/Knuth_shuffle#The_modern_algorithm
        List<T> list = new List<T>(items);
        for (int i = list.Count - 1; i >= 1; i--) 
        {
            int j = random.Next(0, i);
            T temp = list[i];
            list[i] = list[j];
            list[j] = temp;
        }
        return list;
    }
}

答案 4 :(得分:-2)

这个怎么样?

return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
  .OrderBy (x => Guid.NewGuid())
  .Take(50).ToList();