2013-01-18 2 views
3

세 개의 엔티티 프레임 워크 개체 인 퀴즈, 질문 및 옵션이 있습니다. 퀴즈에는 일련의 질문 객체가 있고 질문에는 일련의 옵션 객체가 있습니다. DBContext에서 지정된 퀴즈에 대한 무작위 목록을 반환하고 각 질문에 임의로 정렬 된 관련 옵션 모음을 포함해야합니다.LINQ의 하위 쿼리에 대한 무작위 Orderby

지금까지 질문의 임의 목록을 성공적으로 가져올 수 있었지만 문제의 옵션을 무작위로 추출하는 데 문제가 있습니다.

참고 : 내가 작성한 다른 셔플 확장 메서드가 두 개 있습니다.이 예제에서는 단순화를 위해 Guid에 의한 정렬을 사용하고 있습니다.

var questions = db.Questions.Where(q => q.QuizId == quizId).Include(q => q.Options).OrderBy(a => Guid.NewGuid()); 

어떻게 임의로 임의로 셔플 할 수 있습니까?

+0

필자가 작성한 몇 가지 다른 확장 프로그램이 있지만 너무 느린 것으로 입증되었습니다. 그것은 또 다른 주제이지만, 셔플의 방법이 중요하지 않다는 것을 반영하기 위해 질문을 업데이트 할 것입니다. – Crake

+1

일단 클라이언트에 도착하면 구조를 메모리에 섞으십시오. ORM을 통해 DB 끝에 셔플하는 것이 가능할 수도 있고 그렇지 않을 수도 있습니다. – Servy

+0

@Servy 동의하지만이 경우 클라이언트가 아니며 클라이언트 쪽에서 코드를 작성하지도 않습니다. – Crake

답변

0

LINQ-to-SQL이 이러한 특정 기능의 변환을 지원하는지 잘 모르겠습니다. 부츠에서 데이터베이스에 액세스 할 수있는 경우 here과 같은 저장 프로 시저를 만들어 데이터베이스 수준에서 임의의 행을 가져옵니다. 비록, 이것은 최적되지 솔루션은

다음과 같은 접근 방식에 갈 수있다 (당신이 MAXINT 질문 미만이 가정) (this question에 허용 대답을 참조) 또한 :

Random random; 
var c = Questions.Count(); 

var randomNumbers = new List<int>(); 
var fetchedQuestions = new List<Question>(); 
var randomNumber = random.Next(1,c); 

for (int i = 0; i < maxQuestions; i++) { 
    while (randomNumbers.Contains(randomNumber)) 
     randomNumber = random.Next(1,c); 
    randomNumbers.Add(randomNumber); 
    fetchedQuestions.Add(Questions.ElementAt(randomNumber)); 
} 
return fetchedQuestions; 

즉, 임의의 고유 한 질문 행 번호를 생성하고 해당 행을 가져옵니다.

경고! 사용하기 전에 최적화 필요 - 더티 코드 프로토 타입입니다.

관련 문제