簡體   English   中英

Linq Orderby隨機ThreadSafe用於ASP.NET

[英]Linq Orderby random ThreadSafe for use in ASP.NET

我正在使用Asp.net MVC和Sharp Architecture。

我有這個代碼:

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

我如何隨機訂購? 注意:我不想訂購50個提取的物品,我想先訂購,然后提取50個物品。

THKS

有效實現的一種方法是在數據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. 適用於大多數(所有?)Entity Framework支持的數據庫

這是我的家庭自動化系統用於隨機化播放列表的方法。 它每天都會選擇一個新的種子,在白天提供一致的順序(允許輕松的暫停/恢復功能),但每個新的一天都會重新審視每個播放列表。

描述你可以在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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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