1

我正在摆弄 LINQ to SQL 和 LINQ,但我遇到了一些我不太理解的东西。

当我这样做时:

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);

我明白了

5, 5, 5

我希望得到 5、3、5(如果我尝试使用列表进行模拟也是如此)

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

到底是怎么回事?

4

1 回答 1

3

您提到您使用 Albahari MySQL 驱动程序。如果您查看为第二个查询生成的 SQL,您会发现,该Skip(2)调用不包括在那里。我有这样的输出:

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

显然Skip仅在Take. 这可能是错误,但可能是设计使然,因为LIMITMySQL 中的子句是如何工作的。

我找到了过去的方法。对于此代码:

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

你将会有:

SELECT COUNT(*)
FROM (
SELECT t1.id
FROM (
    SELECT t2.id
    FROM event AS t2
    LIMIT 0, 5
    ) AS t1
LIMIT 2, 2147483647
) AS t0
于 2013-10-15T08:09:40.077 回答