Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按随机顺序排序时,在无限滚动中重复记录_C#_Sql Server_Asp.net Mvc_Jquery - Fatal编程技术网

C# 按随机顺序排序时,在无限滚动中重复记录

C# 按随机顺序排序时,在无限滚动中重复记录,c#,sql-server,asp.net-mvc,jquery,C#,Sql Server,Asp.net Mvc,Jquery,我有一个无限滚动的网页。我在给这卷卷轴输入随机记录,我使用了order by newid。有一个ajax调用,当滚动到达末尾时,它会向页面追加新的随机数据。显然,我用这种方法得到了重复的记录。 我的问题是:有没有办法避免重复记录?我是否应该将已加载到页面的记录存储在某个位置,并将其从选择中排除?或者我应该选择包含随机记录的大型记录集,将其保存在内存中,然后向页面提供该记录集的块?做随机无限卷轴的正确方法是什么?提前谢谢 编辑 按要求编码: 数据提供者: res = data.OrderBy(l

我有一个无限滚动的网页。我在给这卷卷轴输入随机记录,我使用了order by newid。有一个ajax调用,当滚动到达末尾时,它会向页面追加新的随机数据。显然,我用这种方法得到了重复的记录。 我的问题是:有没有办法避免重复记录?我是否应该将已加载到页面的记录存储在某个位置,并将其从选择中排除?或者我应该选择包含随机记录的大型记录集,将其保存在内存中,然后向页面提供该记录集的块?做随机无限卷轴的正确方法是什么?提前谢谢

编辑

按要求编码:

数据提供者:

res = data.OrderBy(l => Guid.NewGuid()).Take(numberOfRecords);
客户:

$.get("/Start/Index/", function (data) {
                if (data != '') {                        
                    isLoading = false;
                    $("#tiles").append(data);});
服务器:

model.PageData = _dataProvider.GetOnePage(recordsPerPage);
return PartialView("_MyView", model.PageData);

据我所知,对大型表使用newid并不快,SqlServer必须为表中的每一行分配一个随机值,然后才能进行排序。这篇MSDN文章有一个小讨论:

要在每次运行查询时获得相同的随机结果,您需要计算并存储顺序,或者根据存储的种子进行预测

您可以尝试以下方法:

  SELECT * FROM Table1
  WHERE (ABS(CAST(
  (BINARY_CHECKSUM(*)) as int)) % 100) < 10
  SELECT * FROM Table1
  WHERE id > ? AND (ABS(CAST(
  (BINARY_CHECKSUM(*) * RAND(?)) as int)) % 100) < 10
BINARY_CHECKSUM函数的一个特性是,每次在未修改的行上使用它时,它都返回相同的校验和数。因此,当它自己使用时,查询的后续运行将返回相同的随机行集。通常这是不可取的,但出于您的目的,它可能是。为了让它对不同的用户更随机,您可以按随机数对二进制校验和*进行多次运算,并传入为该用户会话存储的种子。您还可能希望将二进制校验和中使用的列限制为不改变的可预测列,例如ID和在时间戳处创建的列,并添加where ID>

总而言之,查询可能如下所示:

  SELECT * FROM Table1
  WHERE (ABS(CAST(
  (BINARY_CHECKSUM(*)) as int)) % 100) < 10
  SELECT * FROM Table1
  WHERE id > ? AND (ABS(CAST(
  (BINARY_CHECKSUM(*) * RAND(?)) as int)) % 100) < 10
然后传入两个参数:第一次显示无限滚动时的最大id和当时生成的种子


不幸的是,我无法尝试这个方法-让我知道它是否有效。

经过两天的研究,我发现没有重复记录的随机无限滚动是不容易的。我决定,如果我不能做随机卷轴,我必须做看起来像随机的卷轴,但实际上不是。因此,最终得到了这个解决方案:

data = data.OrderByDescending(link => EntityFunctions.TruncateTime(link.link_timestamp)).OrderBy(l => l.link_randomid).Skip(skip).Take(numberOfRecords);
其中link_randomid是在记录插入时生成的唯一随机id。
希望这能为其他人节省一些时间。

对于这种性质的问题,以及大多数相关问题,最好发布您的代码,以帮助我们找到答案。请发布您的sql/c/客户端代码我按照您的要求发布了代码,但我的方法从定义上讲是错误的。问题是:你将如何完成这项任务?这是一种非常有趣的方法,但有一个问题:这种随机选择并不是完全随机的。以下是20条选定记录的示例:2722843434323978240682407824117 24251 24269 24308 24314 24371 24395 24448 24673 24741 24744我认为这非常有希望,但需要一些调整…取决于您有多少行,您可能只需按RAND排序,并在同一个无限滚动会话中的每个查询上传递相同的种子。