linq:随机排序

时间:2012-02-26 00:31:03

标签: c# linq random

如何更改以下代码,每次从数据库中获取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);

3 个答案:

答案 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();