下午,
任何人都可以看到为什么我的查询不会随机返回6项吗?
public class GetQuestions
{
public int qId { get; set; }
public string question { get; set; }
public string answer1 { get; set; }
public string answer2 { get; set; }
public string answer3 { get; set; }
}
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<GetQuestions> Questions()
{
using (QuizDataContext dc = new QuizDataContext())
{
var query = from q in dc.tblquizs
orderby Guid.NewGuid()
select new GetQuestions
{
qId = q.id,
question = q.q,
answer1 = q.a1,
answer2 = q.a2,
answer3 = q.a3,
};
return query.Take(6).ToList();
}
已更新添加GetQuestions类
答案 0 :(得分:0)
使用
无法获得随机顺序orderby Guid.NewGuid()
您可以通过执行以下查询并查看结果来测试:
from q in dc.tblquizs
select Guid.NewGuid()
答案 1 :(得分:0)
实体框架4.3.1会将Guid.NewGuid()调用转换为newid() - 如果您的DAL支持,这绝对是首选方法。但是,您可能正在使用的任何DAL都不能正确转换呼叫(在这种情况下,它可能会在发送到数据库服务器之前转换为GUID,从而导致订购的静态值)。您应该使用数据库分析器来查看DAL正在做什么。
如果Guid.NewGuid调用未正确转换为newid(),您还有两个选择:
使用类似下面的LINQ(作为最后的手段)
var context = new ScratchContext();
var products = new List<Product>();
for (int i = 0; i < num; i++)
{
Product product = null;
while (product == null)
{
int randomId = r.Next(context.Products.Count());
product = context.Products.FirstOrDefault(p => p.ID == randomId);
}
products.Add(product);
}
return products.AsQueryable();
答案 2 :(得分:0)
我使用以下代码来解决此问题。
var qry = from q in dc.tblwhiskysprintquizs.AsEnumerable()
orderby Guid.NewGuid()
select new GetQuestions
{
qId = q.id,
question = q.q,
answer1 = q.a1,
answer2 = q.a2,
answer3 = q.a3,
};
return qry.Take(6).ToList();
就像添加.AsEnumerable一样简单。
答案 3 :(得分:-1)
orderby Guid.NewGuid()
生成数据库中可能不存在的随机数