Pergunta

Estou tentando criar um serviço de dados ADO.NET com muitas entidades e algumas operações de serviço. Por um lado, criei um aplicativo Web ASP.NET, no qual um modelo de dados ADO.NET entidade e um serviço de dados ADO.NET estão localizados. Por outro lado, criei um segundo aplicativo da Web ASP.NET que possui uma referência de serviço ao serviço de dados.

As entidades estão chegando muito bem, posso usar o LINQ para recuperar os dados que eu quero:

TestEntities entities = new TestEntities(
            new Uri("http://localhost/service/service.svc"));

var query = from customer in entities.Customers
                    where customer.ID == 1234
                    select customer;

query.ToList();

Isso funciona. No entanto, a recuperação de informações através das operações de serviço me iluda completamente. Código do lado do serviço de dados:

public static void InitializeService(IDataServiceConfiguration config) {
    config.SetEntitySetAccessRule("*", EntitySetRights.All);
    config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
}

[WebInvoke]
public IQueryable<Customer> GetSomeCustomers() {
    TestEntities entities = new TestEntities();
    return from customer in entities.Customers
        where customer.ID > 0 && customer.ID < 20
        select customer;
}

Quando adicionei a referência de serviço ao meu projeto de cliente, o Visual Studio não atendeu a nenhuma operação de serviço. Sei que posso acessá -los através de URIs construídos e o método Beginexecute do objeto DataServiceContext ou do objeto Testentidades (neste caso) ou algo assim, mas não é assim que eu o quero.

O que eu quero é usar o LINQ para passar pelos dados retornados da operação de serviço. Isso é possível? Deveria ser, certo?

Foi útil?

Solução

Coisas simples depois de saber.

Apenas algumas coisas para saber:

Atualmente, o DataServiceClientGenerator (que usa o EntityClassGenerator) não cria métodos para as operações de serviço.

Usando o método CreateEquery no contexto não é suportado para operações de serviço, atualmente eles funcionam porque não há validação no lado do cliente para isso (você notará que se você usar o createequery o "()" é adicionado ao final do método de consulta assim "http: //localhost/service.svc/method ()? Parâmetro = 2", Você pode usar o CreateEmery, mas não é recomendado.

Nem todas as operações de serviço retornam valores, mas para este exemplo mostrarei apenas um exemplo para os que o fazem.

public partial class NorthwindEntities
{ 
    public IQueryable<Order> OrdersByRegion(int regionId)
    {
     return this.Execute<Orders>(new Uri(string.Format("{0}OrdersByCountry?regionId={1}", this.BaseUri, regionId), UriKind.RelativeOrAbsolute));
    }
}

Se você precisar de mais informações, sinta -se à vontade para fazer qualquer pergunta.

PS.: No seu exemplo, você não precisa criar um novo contexto de dados em sua operação de serviço (lado do servidor), o DataService já tem uma referência instanciada quando o serviço é chamado.

Você pode realmente substituir a criação do contexto de dados no lado do serviço assim:

protected override NorthwindEntities CreateDataSource()
{
     return new NorthwindEntities();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top