我试图针对每个请求显示随机产品,this OrderBy(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 个产品
最后我还有一个要求我可以在顶部显示最后插入的行并让其他产品是随机的吗?
我可以知道我错过了什么吗?
任何帮助都会很棒。
好的,更新后的要求是:
- 获取所有项目
- 除了第一个项目之外,排序是随机的,第一个项目应该是最后添加的项目
首先,摆脱你的Skip
称呼。你并不是想跳过任何事情。只需将所有产品(可能已订购 - 见下文)提取到列表中即可。
对于随机性部分,我会在调用代码中使用修改后的 Fischer-Yates shuffle 来执行此操作 - Stack Overflow 上有很多这样的示例,例如here.
在这种情况下,您可能希望将最新的项目放在列表的开头,然后将其打乱rest列表中的。只需对洗牌代码进行轻微修改即可轻松实现这一点 - 但您需要首先将最新的项目添加到列表的开头。你可以通过使用来做到这一点OrderByDescending(x => x.InsertionDate)
(或其他)在 LINQ 查询中,或者只是获取所有内容并在 O(n) 遍历内存中的行中找到最新行。使用OrderByDescending
会更简单,但效率可能会稍低(因为您实际上并不需要完整排序)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)