Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# skip和take是如何真正起作用的?_C#_Linq_Linq To Sql - Fatal编程技术网

C# skip和take是如何真正起作用的?

C# skip和take是如何真正起作用的?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我在LINQ中有两个查询: var users = ( from u in dataContext.KUserNumbers select new { u.SubscriberAId, u.BNumber, }).Take(10).ToList(); 结果是: 341767 HjbZ8UUO3Ob0ubTk5q2GXg 3451645 9PJwin/OEIxY5G1O3Wm0Ow 645560 3Ps6KvC2haleNT0cm+0eeA 536

我在LINQ中有两个查询:

var users = (
    from u in dataContext.KUserNumbers
    select new {
        u.SubscriberAId,
        u.BNumber,
}).Take(10).ToList();
结果是:

341767 HjbZ8UUO3Ob0ubTk5q2GXg
3451645 9PJwin/OEIxY5G1O3Wm0Ow
645560 3Ps6KvC2haleNT0cm+0eeA
5360374 ktJuCU861efptHPtSnYtIQ
5352388 SJKJVqeOMpW3yAFLJeeVaQ
3027301 0N2+LgMCpOKvNLkAjBPicQ
24697284 XhmdWliLn0U4UI+jPeeVDw
23555123 ox2sYcehRXKJW0y1ppTGRg
28920232 G3/EkrSpTOPjGHme8itApw
3032925 j/LQt0BtMohrLG5wqWQW0g
第二点:

users = (
    from u in dataContext.KUserNumbers
    select new {
        u.SubscriberAId,
        u.BNumber,
}).Skip(1).Take(10).ToList();
我认为这样的结果会是:

3451645 9PJwin/OEIxY5G1O3Wm0Ow
645560 3Ps6KvC2haleNT0cm+0eeA
5360374 ktJuCU861efptHPtSnYtIQ
5352388 SJKJVqeOMpW3yAFLJeeVaQ
3027301 0N2+LgMCpOKvNLkAjBPicQ
24697284 XhmdWliLn0U4UI+jPeeVDw
23555123 ox2sYcehRXKJW0y1ppTGRg
28920232 G3/EkrSpTOPjGHme8itApw
3032925 j/LQt0BtMohrLG5wqWQW0g
additional one row
我跳过一行。但结果完全不同:

0 //+SDiKdXKBYAoicCWj7Bw
0 //03hO7doOCyhiopFJ82+w
0 //1iwyah26fjsJrQicb5pA
0 //3KaH4CBH2cI9ACwWf03Q
0 //4mtbXsQIg+QzcqTShPsw
0 //4O6INt73MsCRB6LV480A
0 //8zOGzTdDo7RMIoJLA0Mg
0 //CfYwcShDAgqbq3OCY8Nw
0 //cl71U4qnNfIrXwhsi5WQ
0 //CUIHrC0qHfS10AIihnKw
这种行为的原因是什么

谢谢你的帮助

编辑:

如果我在select语句之后添加orderBy subscriberAId,我会得到:

0 Pj5U5pJzrZn4e2Wr4r0H6Q
0 iVu3fam6j3TRbMGdngTtuw
0 i5STtn65LZE7tJfMUPkhug
0 DyhCFKAp5oe0mm5T2Glgpw
0 GaI7ltFJkVeXjMRXShQyLg
0 uneqHdkaBBMeY4Eir7ySZw
0 BAVlunfU4tak4PFY2OxeNg
0 rd4EDeeMUJ/zKDs1IX+Y5w
0 71H3NKg3wLr3/3Iq0HDcEw
0 EeSuYD+003J0g0/ysVteHA

0 nLGfZFEtGnQeJ4I6P8Jy3w
0 B2i5pv26ZzCgi3DISay+Ag
0 57foBJuQV/+6czziRPNQ1A
0 EBBzbvtSDk+T34m+x3F96A
0 BRWpIbeMGQdh/3MANk4AXw
0 0MiqFyqiPpKarJoj/99uMw
0 AdZ6RAHLY86Qe0OG8aZfkw
0 ISSsqPVacX7RQtEwLEWTvw
0 1bPIdr1yDzg8e00gkPmXew
0 k7flvu9G8F8ACWY3zDmSuw
更新查询:

var users = (
    from u in dataContext.KUserNumbers
    select new {
        u.SubscriberAId,
        u.BNumber,
}).OrderBy(u => u.SubscriberAId).Take(10).ToList();

sers = (
    from u in dataContext.KUserNumbers
    select new {
        u.SubscriberAId,
        u.BNumber,
}).OrderBy(u => u.SubscriberAId).Skip(1).Take(10).ToList();
这或多或少就是linq生成的查询的样子。有趣的是,当我在ManagementStudio中使用该查询时,不会返回任何结果。0行:

 SELECT [SubscriberAId], [BNumber]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [SubscriberAId]) AS [ROW_NUMBER], [SubscriberAId], [BNumber]
    FROM [dbo].[KUserNumber] 
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN 1 + 1 AND 1 + 10
ORDER BY [t1].[ROW_NUMBER]

至于这些linq方法究竟是如何工作的,我找到的最好的资源是Jon Skeet重新实现linq到对象,例如Skip/Take:

至于您正在运行的两个linq查询为什么会产生这种效果,我只能预测dataContext.KUserNumbers不会按特定顺序枚举?尝试在两个查询中的select语句之后引入OrderBy,以查看它是否提供了更明显的结果

如果你喜欢这篇文章,你可以在这里找到整个系列:

当您特别使用linq2sql时,另一个很好的调试资源是Debug Visualizer,它允许您查看将传递到数据库层的查询。这通常会煽动db提出的任何异常请求:


要回答“为什么”的问题,我建议检查生成的SQL。这将告诉您如何解释跳过

也就是说,如果跳过计数始终是一个相对较小的数字,那么一个简单实用的解决方案是采用+k.ToList.Skipk。

哈哈:

添加

.ThenByu=>u.B编号解决了这个问题。这意味着您永远无法确定结果是什么,特别是如果表很大,很可能位于sql server中的多个页面上


您需要提供良好的排序尝试将行区分开来

如果您包含order by,会发生什么情况?在调用Skip and Take之前需要这样做。帮助:我编辑了答案以查看结果。请同时显示更新的查询。您使用的是哪个数据库?对象列表不是此处的重点。在linq2sql中,C代码将被转换为SQL。所以真正的问题是:对于OP使用的数据库,linq2sql的数据提供程序如何将Skip和Take转换为SQL?我同意这不是重点,但是,查看它们在LINQ2对象中的实现方式有时可以真正激发人们对其真正功能的了解。我添加了一个链接,指向如何使用调试可视化工具的详细信息,这有助于研究link2sql的问题。@roja:我想说的是:跳过和接受Linq的实现to对象与linq2sql中的Skip和Take实现无关,因为在linq2sql中,这些方法甚至不在C代码中执行。它是这样的:如果用户在其代码中添加了要跳过的调用,请创建以下SQL:xyz@roja:这完全是另外一回事,所以C语言的实现对他没有帮助。