页数和实体框架

0

的问题

在我的移动应用程序,我尝试以检索的数据表我SQL服务器数据库。 我使用的EF和我尝试使用分页的更好的业绩。 我需要检索数据的最后一个要素的表格。 因此,如果表有20个行,我需要,为页0,IDs20日、19日、18日、17日、16然后对第1页Id15日、14日、13日、12日、11日和等...

问题是这样的:如果有什么,虽然用户"A"被下载的数据表格,用户"B"添加行? 如果用户"A"获得页0(以Id20, 19, 18, 17, 16), 和用户"B"在同一时刻,添加行(因此ID21),与经典的查询,用户"A"对于第1页将得到IDs16, 15, 14, 13, 12... 这样另一个时间ID16

我的代码非常简单:

int RecordsForPagination = 5; 
var list = _context.NameTable
                   .Where(my_condition)
                   .OrderByDescending(my_condition_for ordering)
                   .Skip (RecordsForPagination * Page)
                   .Take (RecordsForPagination)
                   .ToList();

当然 Page 是int来自前端。

我如何能解决问题吗?

我找到一个解决方案,但我不知道如果这是完美的一个。 我可以用

.SkipWhile(x => x.ID >= LastID) 

而不是

.Skip (RecordsForPagination * Page)

当然 LastID 总是发送给前端。

你认为性能总是良好用这个代码? 是有一个更好的解决办法?

entity-framework linq sql-server
2021-11-22 23:06:34
1

最好的答案

1

性能的影响在很大程度上将取决于你的SQL指标执行情况和为了通过条款。 但它没有那么多的问题有关的性能,因为它是关于获得预期的结果。

堆溢出是一个很好的例子,那里是一个容积的活动,这样,当你结束的任何一页,下一页中可能包含记录的页面,你只看因为基础记录集已经改变(更多的员额已经加入)

我带来这因为在一个生活系统的一般接受并在某些情况下, 预期 的行为。 作为开发者,我们赞赏增加的间接费用的尝试保持一个单一的结果设定和承认,通常有低得多的价值在试图阻止什么看起来像 重复 作为你迭代该页。

它往往是不足以解释,以用户为什么发生这种情况,在许多情况下,他们将接受它

如果这是对你很重要保持在原来的结果设定的,那么你应当限制查询 Where 条款,但你会需要检索无论是身份证或时间戳在原来的查询。 在你的种情况下你正在尝试使用 LastID但获得最后一个ID将需要一个单独询问在它自己的,因为排序依据的条款将影响。

你真的不能使用 .SkipWhile(x => x.ID >= LastID) 对于这一点,因为 跳过 是一个顺序进程的影响以及是dis-从事的第一个实例,表达评估结果为 false所以如果你了不是基于 Id你跳的话,结果可能是跳过没有记录。

int RecordsForPagination = 5; 
int? MaxId = null;
...
var query = _context.NameTable.Where(my_condition);
// We need the Id to constraint the original search
if (!MaxId.HasValue)
    MaxId = query.Max(x => x.ID);

var list = query.Where(x => x.ID <= MaxId)
                .OrderByDescending(my_condition_for ordering)
                .Skip(RecordsForPagination * Page)
                .Take(RecordsForPagination);
                .ToList();

它一般是简单的筛选一个时间点,因为这是已知从客户没有一个圆的旅行数据库,但是这取决于执行的过滤上的日期可以效率较低。

2021-11-22 23:55:04

我的意图不是要取LastID从数据库(因为,正如你所说,这会影响到Db本身)。 我的意思是这样的:-前端检索网页0和结果的Id20, 19, 18, 17, 16 - 前端检索第1页,并通过以后台的两个param:第1页和LastID的一页(在这种情况下LastID=16)->那么结果将是IDs15, 14, 13, 12, 11... 等等。 我的英语不是完美的...我们说同样的事情吗?
user1106897

@user1106897的技术,克里斯指的是被称为 集页,并且通常远远好于寻呼通过行,这是你在说什么
Charlieface

它非常多的 还有一个问题性:寻呼通过排是效率极低,因为以前所有的行需要读出每一个时间。 而传呼的关键(或时间在这种情况下)是高度有效的,如果有一个支持指数
Charlieface

查理面临非常感谢你的链接时,真正的赞赏。 我将尝试使用的建议
user1106897

谢谢@Charlieface性能的话更多的应该是"忘记的性能,SkipWhile(id)不会解决问题,如果你改变了"伟大的链接也是!
Chris Schaller

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................