UFO ET IT

linq : 무작위로 주문

ufoet 2020. 12. 15. 19:36
반응형

linq : 무작위로 주문


데이터베이스에서 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);

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


컬렉션은 얼마나 큽니까? 그것들을 모두 메모리로 선택한 다음 무작위 컬렉션을 선택할 수 있습니까? 그렇다면 Is using Random 및 OrderBy의 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로 변환하는 방법이 없다고 생각합니다.


똑같은 문제가 있다면 ...

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

참조 URL : https://stackoverflow.com/questions/9449452/linq-order-by-random

반응형