2014-09-01 58 views
0

我有一大堆的記錄是隨機排序,像這樣:尋呼在LINQ + MVC使用隨機有序集合

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

隨機函數返回一個隨機生成的GUID,因此訂購的記錄隨機的方式。現在我的問題是分頁。在MVC中,我對輸入控制器列出的條目列表動作:

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中顯示的條目不同。我絕對需要在第一時間隨機安排記錄,但不會在隨後的查找中查找。

關於如何最好地解決此問題的任何想法?

+0

爲什麼你命令他們什麼特別的原因隨機? – JanR 2014-09-01 07:34:06

+0

@JanR我需要顯示在頁面上隨機顯示的產品列表。 – Rameshwar 2014-09-01 07:39:54

+0

如此緩存產品清單?隨機訂購併從那裏抓取?如果你重新排序每一頁,你將永遠無法分頁,你將需要重新考慮你的設計。 – JanR 2014-09-01 07:51:41

回答

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(); 
    } 
    
+0

當然,CacheContex [「RandomRecords」]只是一個緩存的地方,並且只是作爲一個例子,您可以將緩存放在任何你想要的地方,所以這只是爲了說明的目的。 – 2014-09-01 08:11:50

+0

我想要得到與Justdial.com一樣的結果。他們爲此做了什麼? – Rameshwar 2014-09-01 08:32:21

0

添加一個名爲中將sortOrder列,是一個int。 不要忘記添加一個非唯一的索引或對它進行排序將是不理想的。

把數字放在那裏,從記錄增加到記錄,與您的id或按字母順序排序記錄的順序不同。

然後

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

的GUID會比較慢進行排序,但您也可以使用GUID列的任務。每隔一段時間(每晚一次),您可以遍歷所有記錄以將新值放入sortOrder列,以便人們無法識別訂單。

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