【问题标题】:how to get random rows in linq with last inserted row on top如何在linq中获取随机行,最后插入的行在顶部
【发布时间】:2015-08-25 11:30:29
【问题描述】:

我试图在每个请求的视图中显示随机产品,thisOrderBy(r => Guid.NewGuid()) 工作正常,但是当表记录很大时我试图提高性能,所以我使用了来自here 的第二个选项

我的行动:

public ActionResult ProductType(string id)
{
List<ProductsView> productlist = (from a in this.dbo.ProductTable
                                 join ca in dbo.Category on a.CategoryID equals ca.CategoryID
                                 where ca.Category == id 
                                 select new ProductsView()
                                 {
                                 CategoryID = c.CategoryID,
                                 Categorycount = c.Categorycount
                                 }).ToList<ProductsView>();

// here shuffle or mix products

int count = productlist.Count();
int index = new Random().Next(count);
ViewBag.Products = productlist.Skip(index).ToList();

 return View();

}

但是当视图返回时,一些记录丢失了,例如:

第一次请求 数 4 索引 1

在视图中显示 3 个产品

第二次请求 数 4 索引 2

在视图中显示 2 个产品

第三次请求 数 4 索引 3

在视图中显示 1 个产品

最后我还有一个要求,我可以在顶部显示最后插入的行并让其他产品随机吗?

我可以知道我错过了什么吗?

任何帮助都会很棒。

【问题讨论】:

  • 嗯,它完全按照您的要求做:它跳过了随机数量的行。您的要求在这里真的很不清楚-您所说的“随机产品”到底是什么意思?如果总共有四个产品,您要展示多少个?
  • @Jon Skeet,实际上我想显示 4 个产品,但每个请求的顺序是随机的
  • 对,这根本不是您的代码所说的,是吗?随机 ordering 与完全跳过元素完全不同。您是否总是想展示所有产品?如果有数千个呢?
  • @Jon Skeet,是的,你是对的,但是能做些什么呢?现在我们计划展示所有产品
  • 好的,那么你所说的“最后插入的行在顶部”是什么意思 - 你想要多少不是随机的?只有一个?最后一天的一切?听起来您确实需要在开始实施之前非常仔细地考虑您的需求。

标签: linq entity-framework random linq-to-sql shuffle


【解决方案1】:

好的,更新后的要求是:

  • 获取所有项目
  • 排序是随机的,除了第一项,应该是最后添加的一项

首先,摆脱您的Skip 电话。你不是想跳过任何东西。只需将所有产品(可能已订购 - 见下文)提取到一个列表中。

对于随机性部分,我会在调用代码中使用修改后的 Fischer-Yates shuffle 执行此操作 - Stack Overflow 上有很多这样的示例,例如 here

在这种情况下,您可能希望将最近的项目放到列表的开头,然后将列表的 rest 随机播放。只需对改组代码稍作修改就可以轻松做到这一点 - 但您需要首先将最新项目放在列表的开头。您可以通过在 LINQ 查询中使用 OrderByDescending(x =&gt; x.InsertionDate) (或其他)来做到这一点,或者只是获取所有内容并在 O(n) 中找到最新的行,通过内存中的行。使用 OrderByDescending 会更简单,但效率可能会稍低(因为您实际上并不需要完全排序)。

【讨论】:

  • 首先非常感谢您帮助我,我是新使用扩展助手,我可以知道我该如何使用它吗?在操作方法exthelper.Shuffle(productlist,range);如何获取和传递随机范围参数
  • @stom:您将无法按原样使用它 - 您需要对其进行修改以避免移动第一个元素。我不知道您所说的“随机范围参数”是什么意思-我的回答中的rng 代表“随机数生成器”,而不是“范围”。有关创建/使用 Random 时需要注意的事项,请参阅 csharpindepth.com/Articles/Chapter12/Random.aspx
  • 谢谢您,我会检查并在几天内回复您,非常感谢您的时间。
猜你喜欢
  • 1970-01-01
  • 2020-02-23
  • 2017-12-18
  • 2016-05-28
  • 2016-09-09
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多