LINQ:随机排序

jucafojl  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(123)

我怎样才能改变下面的代码,每次从数据库中获得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);

字符串

2vuwiymt

2vuwiymt1#

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这样的算法可能会更好,下面是一个实现:https://stackoverflow.com/a/375446/284240

igsr9ssn

igsr9ssn2#

收藏品有多大?你能把它们全部选到内存中,然后随机选择一个集合吗?如果是这样,那么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。

wwtsj6pe

wwtsj6pe3#

如果你也有同样的问题,我...

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

yeotifhr

yeotifhr4#

在Entity Framework Core 6+中,有一个新函数:EF.Functions.Random()

db.Table.Where(...).OrderBy(r => EF.Functions.Random()).Take(50)

字符串
这种方法的优点是它使用了数据库引擎的内部功能,并且已经在大多数数据库中实现。
请参阅https://github.com/dotnet/efcore/issues/16141#issuecomment-666641607

相关问题