0

如果我有一个直接扩展的服务,DomainService是否可以在我的服务端查询中使用TakeandSkip参数。

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

[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),则必须返回所有行然后丢弃它们。

我想找到SkipandTake参数,这样我就可以从数据库中返回最少的数据。

4

1 回答 1

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

于 2012-08-28T10:44:20.773 回答