2013-01-18 76 views
3

我有三個實體框架對象,測驗,問題和選項。 Quiz包含Question對象的集合,Question則包含一個Option對象的集合。我想從DBContext返回一個指定測驗的隨機問題列表,每個問題應該包含隨機排序的關聯選項集合。LINQ中的子查詢上的Random Orderby

到目前爲止,我已經能夠成功地獲得問題的隨機列表,但是我無法隨機化問題的選項。

注意:我已經寫了幾個不同的混排擴展方法,在這個例子中,爲了簡單起見,我使用Guid排序。

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

我該如何隨機洗牌選項?

+0

我已經寫了幾個不同的shuffle擴展,但他們已經證明太慢了。這是另一個話題,但我會更新這個問題,以反映洗牌的方法並不重要 – Crake

+1

將內存中的結構洗到內存後很容易。通過ORM在DB端混洗它們可能也可能不可行。 – Servy

+0

@Servy同意,但在這種情況下,我不是客戶,也不是在客戶端編寫代碼。 – Crake

回答

0

我不確定LINQ-to-SQL將支持這種特定功能的轉換。在你的啓動中,如果我有權訪問數據庫,我會創建一個存儲過程,如描述here以在數據庫級別獲取隨機行。不過,這也是一個不最佳的解決方案(見接受的答案this question

你可以去以下方法(假設你有超過MAXINT問題以內):

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; 

即只需生成一些隨機的唯一問題行號並獲取相應的行。

警告!使用前需要優化 - 這是一個髒代碼原型。