简体   繁体   English

LINQ to SQL和Take()和Skip()的顺序

[英]LINQ to SQL and the the order of Take() and Skip()

I am fiddling with LINQ to SQL and LINQ, and I have come across something which I cannot quite understand. 我正在摆弄LINQ to SQL和LINQ,我遇到了一些我无法理解的东西。

When I do this: 当我这样做:

var a = Table.Select(s => s.Id).Take(5).Count();
var b = Table.Select(s => s.Id).Take(5).Skip(2).Count();
var c = Table.Select(s => s.Id).Skip(2).Take(5).Count();
Console.WriteLine("{0}, {1}, {2}", a, b, c);

I get 我明白了

5, 5, 5

I would expect to get 5, 3, 5 (as is also the case if I try and simulate with a List) 我希望得到5,3,5(如果我尝试使用List进行模拟也是如此)

var data = new List<int> {0, 1, 2, 3, 4, 5, 6};

var a = data.AsQueryable().Select(d=>d).Take(5);
var b = data.AsQueryable().Select(d=>d).Take(5).Skip(2);
var c = data.AsQueryable().Select(d=>d).Skip(2).Take(5);
Console.WriteLine("{0}, {1}, {2}", a, b, c);

5, 3, 5

What is going on? 到底是怎么回事?

You mentioned that you use Albahari MySQL driver. 你提到你使用Albahari MySQL驱动程序。 If you look at generated SQL for second query you will find out, that Skip(2) invocation is not included there. 如果你看第二个查询生成的SQL,你会发现,那里没有包含Skip(2)调用。 I have output like this: 我有这样的输出:

SELECT COUNT(*)
FROM (
SELECT t1.id
FROM (
    SELECT t2.id
    FROM event AS t2
    LIMIT 0, 5
    ) AS t1
) AS t0

Apparently Skip works only when followed by Take . 显然Skip只有在Take后面才有效。 It may be bug, but it may be by design because of how LIMIT clause in MySQL works. 它可能是bug,但它可能是设计因为MySQL中的LIMIT子句如何工作。

I found a way to past it. 我找到了一种方法来过去它。 For this code: 对于此代码:

var b = Events.Select(s => s.Id).Take(5).Skip(2).Take(int.MaxValue).Count();

you will have: 您将拥有:

SELECT COUNT(*)
FROM (
SELECT t1.id
FROM (
    SELECT t2.id
    FROM event AS t2
    LIMIT 0, 5
    ) AS t1
LIMIT 2, 2147483647
) AS t0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM