linq: order by random

前端 未结 3 1276
执念已碎
执念已碎 2020-12-02 19:36

How can I change below code, to each time get 50 different random data from database?

return (from examQ in idb.Exam_Question_Int_Tbl
      where examQ.Exam_         


        
相关标签:
3条回答
  • 2020-12-02 20:15

    How big is the collection? Can you select them all into memory then choose a random collection? If so, then the Shuffle algorithm at Is using Random and OrderBy a good shuffle algorithm? would be a good choice.

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

    If not, then I would suggest a stored procedure that does an ordering by newid() ( SQL Server Random Sort ). I don't think there is any way to translate an expression based on a random number generator in C# to LINQ to SQL/Entities.

    0 讨论(0)
  • 2020-12-02 20:27

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

    If this is LINQ-to-SQL you could simply add a ORDER BY NEWID() to your SELECT statement.

    As commented it might be better to use an algorithm like Fisher-Yates Shuffle, here is an implementation: https://stackoverflow.com/a/375446/284240

    0 讨论(0)
  • 2020-12-02 20:34

    If you've the same problem, I had...

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

    After sql-linq it needs to be a LIST, so maybe U need changing to a list, before you're using the OrderBy-NewGuid-Method:

    return (...-SQL-SELECT-LINQ-...)
        .ToList() //****
        .OrderBy(x => Guid.NewGuid()).Take(Limit).ToList();
    
    0 讨论(0)
提交回复
热议问题