0

我有一堆随机排序的记录,如下所示:

var entries = DataContext.Entries.OrderBy(e => Random());

Random 函数返回一个随机生成的 GUID,从而以随机方式对记录进行排序。现在我的问题是分页。在 MVC 中,我有一个用于列出条目的 Entry 控制器的 List 操作:

public class EntryController : Controller 
{
     public ActionResult List(int page)
     {
          int pageSize = 10;

          var entries = DataContext.Entries.OrderBy(e => Random()).Skip((page - 1) *      pageSize).Take(pageSize);
          ViewData["entries"] = entries;
          return View();
     }
}

我的问题是,每当我从一页转到另一页时,条目都会重新排列。因此,当我转到第 1 页(第 1 步),然后转到第 2 页(第 2 步),然后返回第 1 页(第 3 步)时,第 1 步中显示的条目与第 3 步中显示的条目不同。我绝对需要在第一次随机排列记录,但在随后的查找中不需要。

关于如何最好地解决这个问题的任何想法?

4

3 回答 3

1

因为每次调用操作时,随机性都会在分页之前对整个记录再次发生,所以您需要做的是:

  1. 根据需要随机排序记录。
  2. 缓存结果。
  3. 每次在应用分页时调用操作时获取缓存。

    public ActionResult List(int page)
     {
          var dataSource = CacheContext["RandomRecords"];
          if(dataSource == null){
             dataSource = DataContext.Entries.OrderBy(e => Random());
          }
    
          int pageSize = 10;
          var entries = dataSource.Skip((page - 1) * pageSize).Take(pageSize);
    
          ViewData["entries"] = entries;
          return View();
     }
    
于 2014-09-01T08:10:01.573 回答
0

添加一个名为 sortOrder 的列,它是一个 int。不要忘记在其上添加非唯一索引,否则对其进行排序将是次优的。

放一个数字,从一个记录增加到另一个记录,而不是与您的 ID 相同的顺序或按字母顺序对记录进行排序的顺序。

然后

dataSource = DataContext.Entries.OrderBy(e => e.sortOrder);

Guid 的排序速度会较慢,但您也可以使用 guid 列来完成任务。时不时地(每晚一次),您可以遍历所有记录以将新值放入 sortOrder 列中,这样人们就不会识别顺序。

于 2016-03-09T05:21:22.583 回答
0

您可以添加以下SQL代码来获取产品,您只需要生成一些随机数并将其存储到会话或缓存中并再次获取产品..

DECLARE @NumberOfProductsInDatabase INT
DECLARE @RandomNumber VARCHAR(10)

SET @NumberOfProductsInDatabase = (SELECT COUNT(*) FROM Product)
SET @RandomNumber = '45'
SELECT CAST(100000 *  SQRT(EXP(COS(p.SellerId + @RandomNumber))) AS INT) % @NumberOfProductsInDatabase AS RandomProductNr,
    p.Id,p.Name,pv.Price,pv.SalePrice
FROM Product p,ProductVariant pv
WHERE pv.ProductId = p.Id
ORDER BY RandomProductNr
于 2016-03-09T05:40:28.333 回答