Как я могу изменить ниже код, чтобы каждый раз получать 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);
Как я могу изменить ниже код, чтобы каждый раз получать 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);
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/...
Насколько велика коллекция? Можете ли вы выбрать их все в памяти, а затем выбрать случайную коллекцию? Если это так, то алгоритм 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.
Если у вас такая же проблема, у меня был...
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();