Estou avançando em alguns testes, usando um datapager para o meu domainservice, o datapager faz a seguinte chamada para o meu serviço:
http://localhost:52878/ClientBin/ContatosBusinessApplication-Web-ContatoService.svc/binary/GetAll?$skip=20&$take=20&$includeTotalCount=
Pois bem, tenho um método definido no domain service chamado GetAll()
public ICollection<Contato> GetAll()
{
return _contatosContext.Contatos.ToList();
}
Porém o método ignora os argumentos skip e take, a consulta sql traz todos os registros sempre.
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Nome] AS [Nome],
[Extent1].[DataNascimento] AS [DataNascimento],
[Extent1].[Cpf] AS [Cpf],
[Extent1].[Email] AS [Email],
[Extent1].[Anotacoes] AS [Anotacoes]
FROM [dbo].[Contatos] AS [Extent1]
Já em alguns testes que eu fiz com WCF Data Services, com diferença de em vez de take o método usado ser top, a requisição seguinte contra o serviço:
http://localhost:2593/Services/ContatosDataService.svc/Contatos?$skip=20&$top=20
é retornada do banco assim:
SELECT TOP (20)
[Extent1].[Id] AS [Id],
[Extent1].[Nome] AS [Nome],
[Extent1].[DataNascimento] AS [DataNascimento],
[Extent1].[Cpf] AS [Cpf],
[Extent1].[Email] AS [Email],
[Extent1].[Anotacoes] AS [Anotacoes]
FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[Nome] AS [Nome], [Extent1].[DataNascimento] AS [DataNascimento], [Extent1].[Cpf] AS [Cpf], [Extent1].[Email] AS [Email], [Extent1].[Anotacoes] AS [Anotacoes], row_number() OVER (ORDER BY [Extent1].[Id] ASC) AS [row_number]
FROM [dbo].[Contatos] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 20
ORDER BY [Extent1].[Id] ASC
Ou seja, pulando os 20 primeiros, traz apenas os 20 registros seguintes, paginando corretamente no banco de dados.
Eu entendo que RIA Services são uma evolução aos WCF Data Services, porém não consigo implementar algo simples como isso.
Além disso, preciso caso eu queira uma consulta paginada, vou precisar criar um método que receba os argumentos e criar a query linq pra essa consulta específica, enquanto ao usar Data Services eu consigo usar essa consulta linq no client,
ou seja diretamente no webservice que me fornece um dataContext, por exemplo:
Wcf.CodeFirstContainer client = new Wcf.CodeFirstContainer(new Uri("http://localhost:2593/Services/ContatosDataService.svc"));
var q = from c in client.Contatos
where c.Nome.StartsWith("A")
select c;
Essa consulta será convertida para uma requisição http://localhost:2593/Services/ContatosDataService.svc/Contatos?$filter=startswith(Nome,'A')
Da mesma forma, se eu precisar uma consulta com RIA Services, precisarei criar um método no Service
public ICollection<Contato> FindByName(string nome)
{
return (from c in _contatosContext.Contatos
where c.Nome.StartsWith(nome)
select c).ToList();
}
E então chamar no client.
Iuri André Stona