如何更改以下代码,每次从数据库中获取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);
答案 0 :(得分:104)
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,您只需在SELECT语句中添加ORDER BY NEWID()
即可。
评论说使用像Fisher-Yates Shuffle这样的算法可能更好,这是一个实现:https://stackoverflow.com/a/375446/284240
答案 1 :(得分:10)
收藏有多大?你可以将它们全部选入内存然后选择随机集合吗?如果是这样,那么Is using Random and OrderBy a good shuffle algorithm?处的Shuffle算法将是一个不错的选择。
return idb.Exam_Question_Int_Tbl
.Where( e => e.Exam_Tbl_ID == exam_id )
.ToList()
.Shuffle()
.Take( 50 );
如果没有,那么我会建议一个按newid()
(SQL Server Random Sort)排序的存储过程。我认为没有办法将基于C#中随机数生成器的表达式转换为LINQ to SQL / Entities。
答案 2 :(得分:4)
如果你遇到同样的问题,我有......
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之后它需要是一个LIST,所以在你使用OrderBy-NewGuid-Method之前,你可能需要更改为一个列表:
return (...-SQL-SELECT-LINQ-...)
.ToList() //****
.OrderBy(x => Guid.NewGuid()).Take(Limit).ToList();