Linq Orderby random ThreadSafe for use in ASP.NET

One way to achieve efficiently is to add a column to your data Shuffle that is populated with a random int (as each record is created).

The query to access the table then becomes …

Random random = new Random();
int seed = random.Next();
result = result.OrderBy(s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed);

This does an XOR operation in the database and orders by the results of that XOR.

Advantages:-

  1. Efficient: SQL handles the
    ordering, no need to fetch the whole
    table
  2. Repeatable: (good for
    testing) – can use the same random
    seed to generate the same random
    order
  3. Works on most (all?) Entity Framework supported
    databases

This is the approach used by my home automation system to randomize playlists. It picks a new seed each day giving a consistent order during the day (allowing easy pause / resume capabilities) but a fresh look at each playlist each new day.

Leave a Comment