2012-07-23 61 views
1

早上,在LINQ中以NEWID命令並綁定到直放站控件

我想知道如何在LINQ中編寫以下SQL語句。

SELECT TOP 6 * FROM Questions 
ORDER BY NEWID() 

我也想知道,我怎麼可以綁定到一個asp.net轉發器控件來顯示6個問題。

非常感謝:)

+0

您是否希望能夠在數據庫級別執行此操作?你得到的答案不適用於LINQ to SQL,因爲orderby子句將被忽略。 – 2012-07-23 08:26:50

+0

我剛剛提出了一個觀點,它完成了上面的工作,並在LINQ中調用了這個工具。接下來,我需要得到相應的答案。 – thatuxguy 2012-07-23 08:34:17

+0

你的目標是選擇6個隨機問題(因爲它似乎是)? – 2012-07-23 10:03:03

回答

1

LINQ的風格將是

Questions.OrderBy(q=>Guid.NewGuid()).Take(6) 

那麼你附上由其DataSource屬性設置爲以上,並調用DataBind方法的中繼器。

+0

很酷,謝謝,但它似乎只採取前6個問題 – thatuxguy 2012-07-23 08:15:43

+1

嘗試添加.ToList()之間的問題和OrderBy ...? – podiluska 2012-07-23 08:22:35

+0

不錯,作品一種享受。 – thatuxguy 2012-07-23 08:24:50

-1

我假設您使用ORDER BY NEWID()作爲從您的問題中選擇隨機數據的方式?如果是這樣,你應該避免使用NEWID()(或者它的LINQ等價物),這會導致你的表中的每條記錄都會生成一個新的GUID。在大數據集上,這是失敗的。

相反,請參閱Linq Orderby random ThreadSafe for use in ASP.NET以獲得對隨機排序的優化解決方案。然後只需添加一個運算符和您的集合。

Random random = new Random(); 
int seed = random.Next(); 

var RandomQuestions = Questions.OrderBy(s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); //^seed); 

return RandomQuestions.Take(6); 
+0

我不能得到這個工作:( – thatuxguy 2012-07-23 14:24:08

+0

你確定添加Shuffle列到你的數據庫(如鏈接答案中所示)?你得到什麼錯誤。 – 2012-07-23 19:29:33

+0

不是?這個字段是什麼類型? – thatuxguy 2012-07-24 08:02:29

0
(from db in context.Questions 
order by Guid.NewGuid() 
select db).Take(6); 
+1

爲什麼downvote?看起來像是一個合理的答案 – Enigmativity 2012-07-23 08:31:13

+1

我沒有投下任何答案,其他人是,不知道爲什麼tbh。 – thatuxguy 2012-07-23 08:32:52

3

你必須要能夠調用NEWID()函數生成隨機的GUID的。爲此,您可以採取一些提示here,並首先在數據上下文中創建映射到NEWID()函數的僞方法。

[System.Data.Linq.Mapping.Function(Name="NEWID", IsComposable=true)] 
public Guid NewId() 
{ 
    throw new NotImplementedException(); 
} 

一旦設置,你可以再寫入您的查詢使用此功能:

var query = dc.Questions 
    .OrderBy(question => dc.NewId()) 
    .Take(6); 

您可以檢查這個生成的SQL查詢,它應該匹配。

0

我知道答案已經被選中,但我仍然加入我的方式來實現這一點。今天面對同樣的情況並嘗試了幾種方式,使用了questions.OrderBy(q => Guid.NewGuid()).ToList()以及更多建議。後來我想在視圖模型中添加一個新字段string RandomOrder,並在循環中分配了Guid.NewGuid().ToString(),然後使用questions.OrderBy(i => i.RandomOrder).ToList(),這很有效。

如果作者在創建評估時選擇了選項shuffleAlways,我有要求隨機播放問題。如果不是,則按常規排序順序排序。這裏是完整的解決方案:

private List<AssessmentQuestionsViewModel> LoadAllQuestions(string assessmentId, bool shuffleQuestions) 
    { 
     List<AssessmentQuestionsViewModel> questions = new List<AssessmentQuestionsViewModel>(); 

     var items = assessmentQuestionRepository.GetAll().Where(i => i.AssessmentId == assessmentId).ToList(); 

     foreach (var item in items) 
     { 
      questions.Add(new AssessmentQuestionsViewModel 
      { 
       Id = item.Id, 
       AssessmentId = item.AssessmentId, 
       QuestionText = item.QuestionText, 
       HintText = item.HintText, 
       QuestionType = item.QuestionType, 
       MaxMarks = item.MaxMarks, 
       SortOrder = item.SortOrder, 
       RandomOrder = Guid.NewGuid().ToString(), 
       Answers = LoadAllAnswers(item.Id) 
      }); 
     } 

     if (shuffleQuestions) 
     { 
      questions = questions.OrderBy(i => i.RandomOrder).ToList(); 
     } 
     else 
     { 
      questions = questions.OrderBy(i => i.SortOrder).ToList(); 
     } 

     return questions; 
    } 

而這就像魅力。希望這可以幫助他人。