我使用 ASP.NET MVC 5 和实体框架以及 Microsoft SQL Server 后端。
简短版本,我想执行搜索,按随机数对其中的部分进行排序,然后能够稍后显示搜索结果。
详细版本,理论上假设我有一家商店,有 100 万件商品。每个商品有 5 个不同的卖家。我使用实体框架来提取仅由 1 个卖家加入的所有 100 万条记录。该卖家是通过随机编号订购并首先选择来随机挑选的。假设结果页面显示 10 个结果,一旦我转到第 2 页,然后返回第 1 页,我希望第一个商品具有与第一次选择的相同的随机卖家,而不是再次随机选择卖家。如果他们查看卖家的一件商品,然后再看一遍,发现商品有所不同,那将是一种糟糕的用户体验。价格会发生变化等等。
现在我已经通过制作搜索结果表“解决”了这个问题。我将随机挑选的卖家与搜索到的商品一起存储。这样搜索后,我只看搜索结果表,而不用再次执行搜索。当我有 100 条左右的项目时,这很好,但现在我可能有大量记录,而且我不想每次搜索存储 100 万条记录。
除非有人认为有更好的方法,否则我想到了一些我不确定如何应用的东西。如果我可以存储随机数的生成方式,然后存储仅包含该“种子”的搜索结果的 1 条记录,然后我使用该种子再次执行搜索,那么每次都会随机地首先返回同一个卖家。
这样的事情可能吗?如果是这样,我如何在实体框架中调用随机,同时为其提供种子以产生相同的结果?
更希望答案涉及实体框架。
Edit
我尝试了实体框架评论中提到的随机想法,如下所示:
var test = DateTime.Now.Ticks;
Random rand = new Random((int)test);
query.OrderBy(o => rand.Next()).ToList()
//Save test in database so we can retrieve it later to get the same results
我得到了例外:
“LINQ to Entities 无法识别‘Int32 Next()’方法,并且该方法无法转换为存储表达式。”
我觉得如果我能让实体框架发挥得很好,这就是答案。
您可以创建/存储一个随机数(种子):
int seed = new Random().Next(1, 1000);
然后使用CHECKSUM https://learn.microsoft.com/en-us/sql/t-sql/functions/checksum-transact-sql将种子和记录的 ID 结合起来以创建可重现的序列,如下所示:
query.OrderBy(x => SqlFunctions.Checksum(x.ID, seed, x.ID))
.ThenBy(x => x.ID) // Just in case two checksums produce the same value;
SqlFunctions.Checksum https://msdn.microsoft.com/en-us/library/dn177090(v=vs.113).aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)