Как я могу изменить ниже код, каждый раз получать 50 различных случайных данных из базы данных?linq: заказать по производителю
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);
Я не думаю, что это будет работать с базой данных в любом случае (без перевода на SQL), и в итоге это будет O (nlogn). В любом случае ваш компаратор должен обеспечить полное упорядочение (это не так). Вы можете исправить это, выбирая новый GUID (один раз) для каждого элемента, а затем сортируя его, но Fisher-Yates Shuffle (версия Durstenfeldt) - лучший выбор, если вы делаете случайный выбор в памяти. – tvanfosson
-1 http://blogs.msdn.com/b/ericlippert/archive/2011/01/20/spot-the-defect-bad-comparisons-part-one.aspx. во времени t: A> B истинно из-за вашего 'x => Guid.NewGuid()'. в момент времени t + n: A Guid.NewGuid()'. Функции сортировки не предназначены для перетасовки вещей, и это может привести к бесконечному циклу в худшем случае. –
Чтобы расширить свое предложение, '.Select (x => new {Guid = Guid.NewGuid, Question = x}) .OrderBy (x => x.Guid). Выберите (x => x.Question) .Take (50); 'будет работать для выбора в памяти, но вы должны отсортировать его, что в среднем O (nlogn) для лучших алгоритмов. Алгоритм Durstenfeldt работает, беря коллекцию и обменивая каждый элемент в свою очередь со случайным элементом в коллекции, который вы еще не повторили. Это обеспечивает случайное упорядочение, но требует только O (n) операций. – tvanfosson