Pregunta

Estoy tratando de construir un servicio de datos ADO.NET con una gran cantidad de entidades y algunas operaciones de servicio. Por un lado he creado una aplicación Web ASP.NET, en la que se encuentran un modelo de entidad de datos ADO.NET y un servicio de datos ADO.NET. Por otro lado he creado una segunda aplicación Web ASP.NET que tiene una referencia de servicio al servicio de datos.

Las entidades están llegando muy bien, puedo usar LINQ para recuperar los datos que quiero:

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();

Esto funciona. Sin embargo, la recuperación de información a través de operaciones de servicio se me escapa por completo. Datos de código del lado del servicio:

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;
}

Cuando añadí la referencia de servicio a mi proyecto de cliente, Visual Studio no recogió en cualquier labor de mantenimiento. Sé que puedo acceder a ellos a través de URIs construidos y el método de cualquiera de BeginExecute el objeto DataServiceContext o los TestEntities objeto (en este caso), o algo por el estilo, pero no es así como lo quiero.

Lo que quiero es utilizar LINQ que pasar por los datos devueltos de la Operación del Servicio. es posible? Debe ser, ¿verdad?

¿Fue útil?

Solución

Cosas simples una vez que sabes.

A pocas cosas que debe saber:

Actualmente DataServiceClientGenerator (que utiliza el EntityClassGenerator) anunciaron crear métodos para las operaciones de servicio.

Utilizando el método CreateQuery en el contexto no es compatible con las operaciones de servicio, actualmente funcionan porque no hay la validación del lado del cliente para que (se dará cuenta de que si utiliza CreateQuery se añade "()" al final de el método de consulta como esta " http: //localhost/service.svc/method ()? parámetro = 2 ", puede utilizar CreateQuery pero no es recomendable.

No todas las operaciones de servicio valores de retorno, pero para este ejemplo sólo se mostrará un ejemplo para los que lo hacen.

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));
    }
}

Si necesita más información no dude en hacer cualquier pregunta.

PD .: En su ejemplo, usted no necesita crear un nuevo contexto de datos sobre su operación de servicio (servidor) la DataService ya tiene una referencia una instancia cuando el servicio se llama.

En realidad se puede anular la creación del contexto de datos en el lado del servicio como este:

protected override NorthwindEntities CreateDataSource()
{
     return new NorthwindEntities();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top