Подтвердить что ты не робот

Linq: порядок по случайным

Как я могу изменить ниже код, чтобы каждый раз получать 50 различных случайных данных из базы данных?

return (from examQ in idb.Exam_Question_Int_Tbl
      where examQ.Exam_Tbl_ID==exam_id
      select examQ).OrderBy(x=>x.Exam_Tbl_ID).Take(50);
4b9b3361

Ответ 1

http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx

return (from examQ in idb.Exam_Question_Int_Tbl
      where examQ.Exam_Tbl_ID==exam_id
      select examQ).OrderBy(x => Guid.NewGuid()).Take(50);

Если это LINQ-to-SQL, вы можете просто добавить ORDER BY NEWID() в оператор SELECT.

Как уже отмечалось, может быть лучше использовать алгоритм, например Fisher-Yates Shuffle, вот реализация: fooobar.com/questions/107092/...

Ответ 2

Насколько велика коллекция? Можете ли вы выбрать их все в памяти, а затем выбрать случайную коллекцию? Если это так, то алгоритм Shuffle в Является ли использование Random и OrderBy хорошим алгоритмом тасования? - хороший выбор.

return idb.Exam_Question_Int_Tbl
          .Where( e => e.Exam_Tbl_ID == exam_id )
          .ToList()
          .Shuffle()
          .Take( 50 );

Если нет, тогда я бы предложил хранимую процедуру, которая выполняет упорядочение newid() (Случайная сортировка SQL Server). Я не думаю, что есть какой-либо способ перевести выражение на основе генератора случайных чисел в С# в LINQ to SQL/Entities.

Ответ 3

Если у вас такая же проблема, у меня был...

int Limit = 24;
return (from Q in Context.table
where Q.some_key == 1234
select new classDataType() { 
    FirstAttribute = Q.FirstCol,
    SecondAttribute = Q.SecondCol,
    ThirdAttribute = Q.ThirdCol
}).ToList().OrderBy(x => Guid.NewGuid()).Take(Limit).ToList();

После sql-linq он должен быть СПИСОК, поэтому, возможно, вам нужно изменить список, прежде чем использовать метод OrderBy-NewGuid:

return (...-SQL-SELECT-LINQ-...)
    .ToList() //****
    .OrderBy(x => Guid.NewGuid()).Take(Limit).ToList();