簡體   English   中英

SQL Server / Entity Framework - 如何按隨機數排序,然后在稍后重現結果?

[英]SQL Server / Entity Framework - How to order by random number and then reproduce results at a later time?

我將 ASP.NET MVC 5 和實體框架與 Microsoft SQL Server 后端一起使用。

簡短版本,我想執行搜索,按隨機數排序其中的一部分,然后能夠在以后調出搜索結果。

詳細版本,理論上假設我有一家擁有 100 萬件商品的商店。 每件商品有 5 個不同的賣家。 我使用實體框架將所有 100 萬條記錄與只有 1 個賣家連接。 該賣家是通過按隨機數訂購並先選擇的方式隨機挑選的。 假設一個結果頁面顯示 10 個結果,一旦我轉到第 2 頁然后返回到第 1 頁,我希望第一件商品具有第一次選擇的相同隨機賣家,而不是再次隨機選擇賣家。 如果他們查看賣家提供的一件商品,然后再次查看,結果卻有所不同,那將是一種糟糕的用戶體驗。 價格會發生變化等。

現在我已經通過制作搜索結果表“解決”了這個問題。 我存儲隨機挑選的賣家與搜索的項目。 這樣搜索后,我只看搜索結果表,而不是再次執行搜索。 當我有 100 個左右的項目時這很好,但現在我有可能有大量記錄,我不想每次搜索存儲 100 萬條記錄。

除非有人認為有更好的方法,否則我想到了一些我不確定如何應用的東西。 如果我可以存儲隨機數的生成方式,然后為僅包含該“種子”的搜索結果存儲 1 條記錄,然后我再次使用該種子執行搜索,它會隨機地每次首先返回相同的賣家,該怎么辦。

這樣的事情可能嗎? 如果是這樣,我如何在實體框架中調用 random 並為其提供種子以產生相同的結果?

希望答案涉及實體框架。

編輯

我嘗試使用實體框架的評論中提到的隨機想法,如下所示:

var test = DateTime.Now.Ticks;
Random rand = new Random((int)test);

query.OrderBy(o => rand.Next()).ToList()

//Save test in database so we can retrieve it later to get the same results

我得到了例外:

“LINQ to Entities 無法識別方法 'Int32 Next()' 方法,並且此方法無法轉換為存儲表達式。”

我覺得如果我能讓 entityframework 發揮良好的作用,這就是答案。

您可以創建/存儲一個隨機數(種子):

int seed = new Random().Next(1, 1000);

然后使用CHECKSUM組合記錄的種子和 ID 以創建可重現的序列,如下所示:

query.OrderBy(x => SqlFunctions.Checksum(x.ID, seed, x.ID))
     .ThenBy(x => x.ID) // Just in case two checksums produce the same value;

SqlFunctions.Checksum

如果您為Random使用固定種子,那么您可以這樣做:

Random rand = new Random(42);

query.ToArray().OrderBy(o => rand.Next()).ToList()

然后您只需要將42保存到數據庫中。 下次運行時,結果是相同的(只要query以相同的順序返回相同的結果)。

.ToArray()將結果帶入內存,以便您可以調用rand.Next()對結果進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM