locked
RIA Services versus WCF Data Services RRS feed

  • Pergunta

  • Com WCF Data Services eu consigo executar consultas LINQ diretamente no client, enquanto com RIAS não é possível. Porque o RIAS não prevê essa opção, e porque ele é considerado uma alternativa melhor ao Data Services?
    Iuri André Stona
    terça-feira, 8 de fevereiro de 2011 20:11

Todas as Respostas

  • Ola Iuri André Stona,

    Bem o WCF RIA Services  é considerado um alternativa melhor por ser como hibrido de Web Services e ADO.Net Data Services. E o WCF RIA Servives também permite que você adicione restrições LINQ para os terminais de consulta. Salientando que tais recursos são validos para o Silverlight 4.

     

    Links:
    http://www.silverlight.net/getstarted/riaservices/
    http://wildermuth.com/2009/09/29/Choosing_a_Data_Access_Layer_for_Silverlight_3

    Espero ter ajudado,

    Washington Azevedo
    Influenciador Microsoft | Líder de Comunidade técnica Microsoft - XAML4Dev
    http://xaml4dev.wordpress.com

    quarta-feira, 9 de fevereiro de 2011 22:39
  • 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
    quinta-feira, 10 de fevereiro de 2011 13:00