2012-08-28 39 views
0

如果我有一个服务直接延伸DomainService是否可以在我的服务端查询中使用TakeSkip参数。在RIA服务中访问查询参数服务端

例如,这里是我的简单的服务...

[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),它将不得不返回所有的行,然后丢弃它们。

我想查找SkipTake参数,以便我可以从数据库中返回最小数据。

回答

0

它将不得不返回所有行然后丢弃它们。

不,只要您使用的是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项将通过网络传递。

+0

我还没有证实这个答案,但如果MSDN说这是真的,那么它一定是。 – BenCr