LINQ to SQL 以及 Take() 和 Skip() 的顺序
本文关键字:Skip 顺序 to 以及 Take LINQ SQL | 更新日期: 2023-09-27 18:35:18
我正在摆弄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(如果我尝试使用 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
这是怎么回事?
你提到你使用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
时才有效.这可能是错误,但可能是设计使然,因为MySQL中的LIMIT
子句的工作方式。
我找到了一种过去的方法。对于此代码:
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