在RIA Services中访问查询参数服务端

时间:2012-08-28 09:39:32

标签: silverlight wcf-ria-services

如果我有直接扩展DomainService的服务,则可以在我的服务端查询中使用TakeSkip参数。

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

[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参数,以便从数据库中返回最小数据。

1 个答案:

答案 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个项目将通过网络传递。