我正在将ASP.NET MVC 5和Entity Framework与Microsoft SQL Server后端一起使用。
简短的版本,我想执行搜索,以随机数对部分内容进行排序,然后可以在以后的时间显示搜索结果。
详细版本,从理论上讲,我的商店有100万个商品。每个商品都有5个不同的卖家。我使用实体框架提取了只有1个卖方加入的所有1百万条记录。通过随机编号订购并首先选择,即随机选择了该卖方。假设显示10个结果的结果页,一旦我转到第2页,然后返回第1页,我希望第一个项目具有与第一次采摘的随机卖方相同的随机卖方,而不是再次随机采摘卖方。如果他们正在看卖方的一件商品,然后又看又一遍,那将是糟糕的用户体验。价格会改变,等等。
现在,我已经通过制作搜索结果表来“解决”此问题。我存储了与搜索到的物品随机挑选的卖方。这样,在搜索之后,我仅查看搜索结果表,而不是再次执行搜索。当我有100个左右的项目时,这很好,但是现在我有大量记录的可能性,而且我不想每次搜索都存储100万条记录。
除非有人认为有更好的方法,否则我会想到我不确定如何应用。如果我可以存储生成随机数的方式,然后为仅包含该“种子”的搜索结果存储1条记录,然后我再次使用种子进行搜索,并且它将随机得到相同的卖方第一次返回的结果,该怎么办?
这样有可能吗?如果是这样,我如何在实体框架中调用随机变量,同时给它提供种子以产生相同的结果?
希望答案涉及实体框架。
编辑
我尝试使用实体框架的注释中提到的随机想法,方法如下:
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()’方法,并且该方法无法转换为商店表达式。”
我觉得如果我能使entityframework发挥得很好的话,这将是答案。
您可以创建/存储一个随机数(种子):
int seed = new Random().Next(1, 1000);
然后使用CHECKSUM组合种子和记录的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