如果我有直接扩展DomainService
的服务,则可以在我的服务端查询中使用Take
和Skip
参数。
例如,这是我的简单服务......
[EnableClientAccess()]
public class StaffService : DomainService
{
[Query]
public IQueryable<StaffMember> GetStaffMembers()
{
var list = new List<StaffMember>
{
new StaffMember { Id=1, Name = "Bobby", JobDescription = "Driver" },
new StaffMember { Id=2, Name = "Robert", JobDescription = "Driver's Mate" },
new StaffMember { Id=3, Name = "Maxwell", JobDescription = "Diver" },
new StaffMember { Id=4, Name = "Samuel", JobDescription = "Raver" }
};
return list.AsQueryable();
}
}
和我的简单查询...
context.Load<StaffMember>(context.GetStaffMembersQuery().Skip(1).Take(2));
这样做,只返回4行中的2行,但如果这是访问数据库(例如使用NHibernate),则必须返回所有行,然后丢弃它们。
我想找到Skip
和Take
参数,以便从数据库中返回最小数据。
答案 0 :(得分:0)
它必须返回所有行然后丢弃它们。
不,只要您使用IQueryable<T>
即可。 IQueryable<T>
接口旨在供查询提供程序实现。
来自MSDN:
这些扩展IQueryable的方法不会直接执行任何查询。相反,它们的功能是构建一个Expression对象,它是一个表示累积查询的表达式树。
所以你的查询,例如
public IQueryable<StaffMember> GetStaffMembers()
{
return dbContext.StaffMembers;
}
并在客户端
context.Load<StaffMember>(context.GetStaffMembersQuery().Skip(1).Take(2));
将由TSQL生成器翻译为:
SELECT TOP (2)
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
FROM (
SELECT [Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
row_number() OVER (ORDER BY [Extent1].[ID] ASC) AS [row_number]
FROM [dbo].[StaffMember] AS [Extent1]) AS [Extent1]
WHERE [Extent1].[row_number] > 1
所以只有2个项目将通过网络传递。