2015-06-09 122 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