0

直接拡張するサービスがある場合、サービス側のクエリでandパラメータ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 を使用して) データベースにアクセスしていた場合は、すべての行を返してから破棄する必要がありました。

データベースから最小限のデータを返すことができるように、Skipおよびパラメータを見つけたいと思います。Take

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 に答える