使用随机排序的集合在LINQ + MVC中进行分页

时间:2014-09-01 07:32:26

标签: asp.net-mvc linq custompaging

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

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

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

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中显示的条目不同。我绝对需要第一次随机排列记录,而不是随后的查找。

有关如何最好地解决此问题的任何想法?

3 个答案:

答案 0 :(得分: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();
     }
    

答案 1 :(得分:0)

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

在那里加上一个数字,从记录增加到记录,不是与你的id相同的顺序或按字母顺序对记录排序的顺序。

然后

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

Guids的排序速度会慢一些,但您也可以使用guid列来完成任务。每隔一段时间(每晚一次),您可以遍历所有记录,将新值放入sortOrder列,以便人们无法识别订单。

答案 2 :(得分: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