2015-06-09 119 views
0

我有一個ArrayList,我需要能夠單擊一個按鈕,然後從該列表中隨機挑選一個字符串並將其顯示在消息框中。從表中隨機獲取元素

我正在使用實體框架6.x和我有一個表問題。

我想隨機得到從這個表中10個元素,這是我試過的代碼:

List<Question> GetQuestionsRandomly() 
{ 
    Random rnd = new Random(); 
    return context.Questions.OrderBy(x => rnd.Next()).Take(10).ToList(); 
} 

,但我得到這個錯誤信息:

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll 

Additional information: LINQ to Entities does not recognize the method 'Int32 Next()' method, and this method cannot be translated into a store expression. 

我該如何解決這個問題?

回答

5

代替Random.Next使用Guid以隨機順序記錄。像:

return context.Questions.OrderBy(x => Guid.NewGuid()).Take(10).ToList(); 

你所得到的錯誤,因爲LINQ表達式將被轉換成基礎數據源語言,(可能在你的情況下,SQL),由於Random.Next未實現轉換爲SQL,你會得到例外。

+0

謝謝,請你解釋一下這個Guid.NewGuid()如何在上面的例子中工作? –

+0

@AimadMAJDOU,Guid生成的將是唯一的,所以你每次都會得到一個隨機的順序,再加上'Guid.NewGuid'將會被轉換成SQL中的'NEWID()',所以你的SQL或者類似於'Order通過NEWID()',使用分析器並檢查生成的SQL以確保。 – Habib

2

您可以使用Guid

using (var db = new DataStore()) 
      { 
       var entities = db.Questions 
           .OrderBy(t => Guid.NewGuid()) 
           .Take(numOfEntries); 
        return result.ToList(); 
      } 
0

您不能在查詢中使用rnd.Next(),因爲它不能轉換爲SQL。改爲使用guid:

Random rnd = new Random(); 
return context.Questions.OrderBy(x => Guid.NewGuid()).Take(10).ToList(); 
+0

這不起作用,因爲它只會生成一個數字。 – vmg

+0

在這種情況下,不會爲每一行生成一個隨機值,我不確定結果每次都會有所不同 –

+0

這是真的,我沒有考慮它。改爲guid。 – Alioza