Expor IQueryable sobre o serviço WCF

Eu tenho aprendido sobre IQueryable e preguiçoso carregamento / execução diferida de consultas.

É possível expor essa funcionalidade sobre o WCF? Eu gostaria de expor um serviço LINQ para SQL que retorna um IQueryable que eu possa, em seguida, executar consultas adicionais no cliente e, finalmente, executar usando um .ToList (). O formato OData é aplicável a todos neste contexto?

Se possível, qual é o termo para esta técnica e quais são alguns bons tutoriais que eu posso seguir? Obrigado.

Você deve verificar o WCF Data Services, que permitirá que você defina a consulta Linq no cliente. O WCF Data Services é provavelmente a única solução para sua necessidade.

O IQueryable ainda é apenas uma interface e a funcionalidade depende do tipo de implementação da interface. Você não pode expor diretamente as consultas Linq-To-Sql ou Linq-To-Entities. Existem vários motivos, como contextos de vida curta ou serialização, que executarão a consulta para que o cliente obtenha uma lista de todos os objects, em vez da consulta.

até onde eu sei, o datacontext não é serializável, o que significa que você não pode passá-lo com o WCF

Você pode usar http://interlinq.codeplex.com/, que permite enviar uma consulta Linq sobre o WCF.

O WCF Data Services só pode ser usado com webHttpBinding e nem todas as consultas Linq podem ser expressas. Escrever consultas quando o serviço de dados do WCF é usado não é tão atraente – requer expressões de seqüência de caracteres, como:

.AddQueryOption("$filter", "Id eq 100"); 

https://remotelinq.codeplex.com/ é outra opção. Mas funciona no AppDomain para verificar as montagens atuais e serializá-las. Esta tecnologia não é adequada para o WinRT como nenhum domínio para o WinRT App

Eu tenho lutado com a mesma pergunta e percebi que uma pergunta bem formada é um problema resolvido.

O IQueryable basicamente serve para filtrar a consulta antes de enviá-la à sua chamada DB, em vez de obter 1000 registros e filtrar apenas 10, você obtém esses 10 para começar. Essa filtragem pertence à sua camada de serviço, mas se você estiver criando uma API, presumo que você a mapeie com os parâmetros AND / OR em sua URL.

http: // {host} / {entity} / q? name = john & age = 21.

Então você acaba com algo assim:

 Filter:Column1=Value1 > http://{host}/{entity}q?column1=value1 > SELECT * FROM Entity WHERE Column1=Value1 MVC > WCF > DB 

Você pode encontrar uma amostra muito boa [ aqui ]

Por fim, como sua carga do WCF provavelmente será um JSON, você pode (e deve) desserializá-los em seus Modelos de Domínio dentro de uma coleção. É até este ponto em que a paginação deve ocorrer, então eu recomendaria algum cache WCF (e desde seu HTTP, é realmente simples). Você ainda estará usando o LINQ no lado WebApp, apenas sem a cláusula LINQ “WHERE” (a menos que você queira criar dinamicamente a URL expressa acima?)

Para uma consulta OR complexa, você se importa com várias consultas do WCF (1 por “AND”) e, em seguida, concatena todas juntas

Se for possível enviar IQuerable <> sobre o WCF, não é uma boa coisa, em termos de segurança, já que o IQuerable <> poderia expor coisas como a cadeia de conexão com o database. Alguns dos comentários anteriores parecem promissores.

Intereting Posts