我正在使用带有 Sharp 架构的 Asp.net MVC。

我有这个代码:

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

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

谢谢

有帮助吗?

解决方案

一种有效实现的方法是向您的数据 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. 适用于大多数(全部?)实体框架支持的 数据库

这是我的家庭自动化系统用来随机播放列表的方法。它每天挑选一个新种子,在白天提供一致的顺序(允许轻松暂停/恢复功能),但每天都会重新审视每个播放列表。

其他提示

您可以按照 这里 所述在 T-Sql 中执行此操作。我认为您不能在 linq 中执行此操作而不将整个结果集加载到内存中然后将其大部分丢弃,这是您不想这样做的。

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

可能最好编写自己的扩展方法来做到这一点。

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;
    }
}

这个怎么样?

return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
  .OrderBy (x => Guid.NewGuid())
  .Take(50).ToList();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top