我想知道如何在LINQ中編寫以下SQL語句。
SELECT TOP 6 * FROM Questions
ORDER BY NEWID()
我也想知道,我怎麼可以綁定到一個asp.net轉發器控件來顯示6個問題。
非常感謝:)
我想知道如何在LINQ中編寫以下SQL語句。
SELECT TOP 6 * FROM Questions
ORDER BY NEWID()
我也想知道,我怎麼可以綁定到一個asp.net轉發器控件來顯示6個問題。
非常感謝:)
我假設您使用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);
(from db in context.Questions
order by Guid.NewGuid()
select db).Take(6);
爲什麼downvote?看起來像是一個合理的答案 – Enigmativity 2012-07-23 08:31:13
我沒有投下任何答案,其他人是,不知道爲什麼tbh。 – thatuxguy 2012-07-23 08:32:52
你必須要能夠調用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查詢,它應該匹配。
我知道答案已經被選中,但我仍然加入我的方式來實現這一點。今天面對同樣的情況並嘗試了幾種方式,使用了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;
}
而這就像魅力。希望這可以幫助他人。
您是否希望能夠在數據庫級別執行此操作?你得到的答案不適用於LINQ to SQL,因爲orderby子句將被忽略。 – 2012-07-23 08:26:50
我剛剛提出了一個觀點,它完成了上面的工作,並在LINQ中調用了這個工具。接下來,我需要得到相應的答案。 – thatuxguy 2012-07-23 08:34:17
你的目標是選擇6個隨機問題(因爲它似乎是)? – 2012-07-23 10:03:03