【问题标题】:Linq Returning random entities after join加入后Linq返回随机实体
【发布时间】:2014-07-16 19:48:33
【问题描述】:

我正在尝试从我编写的加入查询中返回随机实体。但它不会随机返回。实体总是和以前一样。可能是什么问题?这是查询

            var query = (from b in db.BrandTbls.AsQueryable()
                     join m in db.ShoeModelTbls on b.BrandID equals m.BrandID
                     join s in db.ShoeTbls on m.ModelID equals s.ModelID
                     join i in db.ShoeImageTbls on s.ShoeID equals i.ShoeID
                     group new {b,m,s,i} by new {b.BrandName,m.ModelName,m.Price,s.PrimaryColor,s.SecondaryColor,i.ImagePath} into g
                     orderby Guid.NewGuid()
                     select new {g.Key.BrandName,g.Key.ModelName,g.Key.ImagePath,g.Key.Price,g.Key.PrimaryColor,g.Key.SecondaryColor}).OrderBy(x => Guid.NewGuid()).Take(8);

【问题讨论】:

  • orderby Guid.NewGuid() 将类似于 orderby 1。它不会导致随机返回。
  • 我从网上找到的一些文件中看到了这种方式。
  • @Tartar 并非您在互联网上看到的所有内容都是正确的。
  • 当然不是,但我看到这个解决方案至少有 3 个不同的网页,然后我认为它是正确的。

标签: c# sql linq entity-framework random


【解决方案1】:

GUIDs are not random numbers. They are unique numbers。有许多方法可以生成唯一值,其中许多根本不是随机的。生成的 GUID 值甚至可能单调递增,这意味着对序列中每个项目的新 guid 进行排序将导致每个项目保持完全相同的顺序。

Shuffling a set of data is a well defined problem, with well defined solutions.您应该使用有据可查的解决方案之一来解决洗牌问题,以可靠有效地洗牌数据集合。

【讨论】:

    【解决方案2】:

    orderby Guid.NewGuid() 与 orderby 1 类似,不会导致随机返回。

    我建议让 SQL 执行随机化操作。看这个例子:

    Random row from Linq to Sql

    您可以创建一个空的 Random 方法,LINQ 会将其转换为对 SQL 的 Random T_SQL 调用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2011-01-18
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多