linq:随机排序

本文关键字:排序 随机 linq | 更新日期: 2023-09-27 18:25:59

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

linq:随机排序

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

集合有多大?你能把它们全部选进内存,然后随机选择一个集合吗?如果是这样的话,那么乱序算法是使用Random和OrderBy的一个好的乱序算法吗?这将是一个不错的选择。

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

如果不是,那么我建议使用一个存储过程,该存储过程按newid()(SQL Server随机排序)进行排序。我认为没有任何方法可以将C#中基于随机数生成器的表达式转换为LINQ到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之后,它需要是一个LIST,所以在使用OrderBy NewGuid方法:之前,可能U需要更改为一个列表

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