Take()
Take 运算子是扩充自 IEnumerable 的方法,只需传入一个 int 型別的参数,表示要取回的项目个数。当 Take 运算子被调用时,会从来源序列的第一個项目开始,依序取回指定数量的项目当做结果回传。
Skip()
Skip 运算子和 Take 运算子正好相反,它可用来跳过来源序列中的前几个项目,再把剩下的资料全部回传。
用法
这两个函数可以直接在c#中用来做分页处理。但是两个函数的顺序不能反。不然容易引发数据混乱的问题。最好是先用source.Skip().Take()。也可以先将source.ToList(),然后进行Skip().Take()。因为先List()的话,会执行sql查询返回有序的结果集。这样查询变不会出错。
sql关键字执行顺序
(http://blog.csdn.net/cqnuztq/article/details/8683656)
这两个函数对应的查询
source.Take().Skip()对应的sql:
select *,row_number() OVER(order by [col]) as row_number from (select * from (
select * from (FROM "A" WHERE ()) "Project1"
ORDER BY "Project1"."[col]"
)
WHERE (ROWNUM <= num )) "Project2"
WHERE ("Project2"."row_number" > 0)
ORDER BY "Project2".[col] DESC
source.Skip().Take()对应的sql:
select * from
(select ROWNUM num, *,row_number() OVER(order by [col]) as row_number from "Project1"
WHERE ("Project1"."row_number" > num)
ORDER BY "Project1"."[col]" )
WHERE (ROWNUM <= num )
现在开始考虑两个函数的先后顺序,首先,每次select的时候都会产生一个rownum,并且按顺序排列。如果source.Skip().Take(),那么是首先得到一个按日期排序,并按照row_number筛选的结果集。第二个查询又会重新生成一个rownum,同样也是个顺序排列的新的rownum,然后再依据num进行筛选。如果source.Take().Skip(),先排序之后查询rownum,生成第二次rownum时再筛选,此时的结果已经是混乱的了。所以下面无论怎么操作几乎都是错误的。因此这两个函数使用时,需要注意顺序。不然分页之后的数据就很容易混乱。
本文介绍了C# Linq中用于分页的Skip和Take运算符。Take()用于获取序列中指定数量的元素,而Skip()则用于跳过指定数量的元素。正确使用顺序应为source.Skip().Take(),以避免数据混乱。先转换为List()再进行Skip().Take()可以确保有序结果集。理解这两个函数的工作原理对于防止分页错误至关重要。
401

被折叠的 条评论
为什么被折叠?



