为什么我的查询没有返回6项?

时间:2012-07-23 13:52:09

标签: asp.net linq linq-to-sql

下午,

任何人都可以看到为什么我的查询不会随机返回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类

4 个答案:

答案 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(),您还有两个选择:

  1. 使用sproc
  2. 使用类似下面的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()  

生成数据库中可能不存在的随机数