正文
IQueryable
query
,
int
skip
,
int
take
)
{
return
query
.
Skip
(
skip
).
Take
(
take
);
}
我们可以这样做:
var
query
=
...
var
thirdPage
=
query
.
Paginate
(
20
,
10
);
更重要的是,在这里我们可以进行任意的分页查询。换言之就是通过 LINQ 你可以把查询分解成一部分,然后在你的应用程序中重用。
联合
LINQ 另一好处就是你可以不用 JOIN 就能进行关系间查询。例如,我们想要列出所有购物在 $1000 或者以上,并且居住在华盛顿的顾客。我们会假定让购买项目化(也就是经典的采购/项目采购场景)并且把(没有顾客记录的)现金销售也囊括进来。这就需要在四个表(Purchase, Customer, Address 以及 PurchaseItem)之间进行查询。使用 LINQ,这样的查询不费吹灰之力:
from
p
in
db
.
Purchases
where
p
.
Customer
.
Address
.
State
==
"WA"
||
p
.
Customer
==
null
where
p
.
PurchaseItems
.
Sum
(
pi
=>
pi
.
SaleAmount
)
>
1000
select
p
将此与同等功能的 SQL 相比较:
SELECT
p
.
*
FROM
Purchase
p
LEFT
OUTER
JOIN
Customer
c
INNER
JOIN
Address
a
ON
c
.
AddressID
=
a
.
ID
ON
p
.
CustomerID
=
c
.
ID
WHERE
(
a
.
State
=
'WA'
||
p
.
CustomerID
IS
NULL
)
AND
p
.
ID
in
(
SELECT
PurchaseID
FROM
PurchaseItem
GROUP
BY
PurchaseID
HAVING
SUM
(
SaleAmount
)
>
1000
)
对此例进一步扩展,假设我们想要将结果集按价格进行逆序排列,并在最终的投影中显示销售员的姓名以及所购买项目的数量。我们可以自然不重复地表达出这些附件的查询条件:
from
p
in
db
.
Purchases
where
p
.
Customer
.
Address
.
State
==
"WA"
||
p
.
Customer
==
null