C# SQL Server/实体框架-如何按随机数排序,然后在以后重新生成结果?

C# SQL Server/实体框架-如何按随机数排序,然后在以后重新生成结果?,c#,sql,sql-server,asp.net-mvc,entity-framework,C#,Sql,Sql Server,Asp.net Mvc,Entity Framework,我正在使用ASP.NETMVC5和实体框架以及MicrosoftSQLServer后端 简短的版本,我想执行一个搜索,按随机数排序部分,然后能够在以后显示搜索结果 详细的版本,理论上,假设我有一个商店,有100万件商品。每件商品有5个不同的卖家。我使用实体框架拉取所有100万条记录,其中只有一个卖家。该卖家是通过按随机数排序并首先选择来随机挑选的。假设结果页面显示10个结果,一旦我转到第2页,然后返回到第1页,我希望第一个项目具有第一次随机挑选的卖家,而不是再次随机挑选卖家。如果他们从卖家那里看

我正在使用ASP.NETMVC5和实体框架以及MicrosoftSQLServer后端

简短的版本,我想执行一个搜索,按随机数排序部分,然后能够在以后显示搜索结果

详细的版本,理论上,假设我有一个商店,有100万件商品。每件商品有5个不同的卖家。我使用实体框架拉取所有100万条记录,其中只有一个卖家。该卖家是通过按随机数排序并首先选择来随机挑选的。假设结果页面显示10个结果,一旦我转到第2页,然后返回到第1页,我希望第一个项目具有第一次随机挑选的卖家,而不是再次随机挑选卖家。如果他们从卖家那里看一件商品,然后再看一眼,结果就不一样了,这将是一种糟糕的用户体验。价格会变化等等

现在我已经通过制作搜索结果表“解决”了这个问题。我存储随机挑选的卖家和搜索的物品。这样,在搜索之后,我只查看搜索结果表,而不是再次执行搜索。当我有100个左右的项目时,这很好,但现在我有可能有巨大的记录,我不想每次搜索存储100万条记录

除非有人认为有更好的方法,否则我想到了一些我不确定如何应用的方法。如果我可以存储生成随机数的方式,然后存储一条只包含“种子”的搜索结果记录,然后我用种子再次执行搜索,每次都会随机返回相同的卖家,会怎么样

这样可能吗?如果是这样,我如何在实体框架中调用random,同时给它一个种子以产生相同的结果

希望答案涉及实体框架

编辑

我尝试了实体框架评论中提到的随机想法,如下所示:

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发挥出色,这就是答案。

您可以创建/存储一个随机数(种子):

然后使用组合种子和记录ID以创建可复制的序列,如下所示:

query.OrderBy(x => SqlFunctions.Checksum(x.ID, seed, x.ID))
     .ThenBy(x => x.ID) // Just in case two checksums produce the same value;

如果对
随机
使用固定种子,则可以执行以下操作:

Random rand = new Random(42);

query.ToArray().OrderBy(o => rand.Next()).ToList()
然后只需将
42
保存到数据库中。下次运行此命令时,结果是相同的(只要
query
以相同的顺序返回相同的结果)


.ToArray()
将结果带到内存中,以便您可以调用
rand.Next()
对结果进行排序。

您在这里寻找的答案是什么?如果您需要对数据进行随机排序,然后再按相同的随机顺序对其进行排序,则必须将顺序存储在某个位置。可能将其存储在会话、缓存或临时表中?不需要是所有数据,但也可以代替再次查询所有数据。按随机数排序似乎也是一种糟糕的用户体验。@SeanLange我希望能够在搜索结果表中存储一些内容,但我不知道如何获取随机数生成器的种子并使用它。朱哈尔,你知道一个更好的方法来获得一个随机卖家吗?卖方应在初次搜索时随机挑选。在这种情况下,用户不知道其他卖家。我没有给出选择,但任何一个卖家都会有一个相同的变化来展示。你可以考虑一个基于随机的解决方案,用一个种子调用,它会产生确定的值集。如果你只储存种子,你以后可以得到同样的结果。这是非常模糊的。我可以想出十几种可能性,但这一切都取决于您的实现和您正在尝试做什么。所以我想我的示例中的id应该是卖方id?如果你不介意的话,校验和到底是什么?我现在要对此进行测试。@SolidSnake4444-
ID
需要能够唯一标识您的行的东西在大约50行上测试了大约50次,它似乎工作得很好。我每次都会得到一个随机的结果,如果我提供一个重复的种子,我每次都会得到相同的结果。看起来很快。非常感谢你!我在一个记录集上测试了它,这个记录集是一个基本列表,而不是实际的卖家等等。现在我这样做了,订单是随机的,但是卖家自己总是在同一个订单上。因此,卖方1始终在2之前,但卖方1可能出现在插槽300中,卖方2出现在插槽789中,但1始终在2之前。我希望2有时是第一个,并且能够复制。我可能需要稍微调整一下你的校验和。下一步我会尝试,除非你能猜出为什么会发生这种情况?@SolidSnake4444-你可以尝试使用校验和,但我认为你受到你的
卖家ID
的限制(它可能是一个整数升序列表)。尝试向checksum
SqlFunctions.checksum(x.ID,x.Name,seed)
添加额外的列,或者如果这不起作用,创建一个新列并在itI中存储一个随机数。我需要它在SQL中,因为如果我必须将每个卖家都放入内存中,返回的记录量将是巨大的。@SolidSnake4444-是的,但这和你在问题中提出的
query.OrderBy(o=>rand.Next()).ToList()
没有什么不同。@Enigmativity我想如果OP希望使用他在问题中提出的内容,他就不必先问问题了。OrderBy是一个纯方法,因此必须使用返回值来获得结果,这与旧的排序方法不同。
Random rand = new Random(42);

query.ToArray().OrderBy(o => rand.Next()).ToList()