我试图在每个请求的视图中显示随机产品,这个OrderBy(r => Guid.NewGuid())
工作得很好,但我试图在表记录巨大时提高性能,所以我从这里使用了第二个选项
我的行动:
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个产品
<<p> 第三方的请求/strong>数4指数3显示1个产品
最后我还有一个要求我可以在顶部显示最后插入的行并让其他产品是随机的吗?
我可以知道我错过了什么吗?
好的,那么更新后的需求是:
- 获取所有项目
- 排序是随机的,除了第一项,它应该是最后添加的
首先,取消您的Skip
呼叫。你没有试图跳过任何东西。只需将所有产品(可能已订购-见下文)提取到列表中。
对于随机性部分,我会在调用代码中这样做,使用修改的fisher - yates洗牌-在Stack Overflow中有许多这样的例子,例如这里。
在这种情况下,您可能希望将最近的项放到列表的开头,然后对列表的其余进行洗牌。这很容易做到,只需稍微修改一下变换代码—但是您需要首先将最近的项放到列表的开头。你可以通过在LINQ查询中使用OrderByDescending(x => x.InsertionDate)
(或任何东西)来做到这一点,或者只是获取所有内容并在O(n)传递内存中的行中找到最新的行。使用OrderByDescending
会更简单,但可能会稍微降低效率(因为您并不真正需要完全排序)。