Tutorial: Obtener acceso a un servicio OData mediante proveedores de tipo (F#)
OData, que significa Open Data Protocol, es un protocolo para la transferencia de datos a través de Internet. Muchos proveedores de datos exponen el acceso a sus datos mediante la publicación de un servicio Web de OData. Se puede tener acceso a los datos de cualquier origen OData en F# 3.0 usando los tipos de datos que se generan automáticamente mediante el proveedor de tipo ODataService. Para obtener más información sobre OData, vea Introducing OData.
En este tutorial aprenderá a usar el proveedor de tipo ODataService de F# para generar tipos de cliente para un servicio OData y para consultar las fuentes de distribución de datos que proporciona el servicio.
Este tutorial muestra las tareas siguientes, que se deben realizar en el orden presentado a continuación para finalizarlo correctamente:
Configurar un proyecto de cliente para un servicio OData
Tener acceso a tipos OData
Consultar un servicio OData
Comprobar las solicitudes OData
Configurar un proyecto de cliente para un servicio OData
En este paso configurará un proyecto para que utilice un proveedor de tipo de OData.
Para configurar un proyecto de cliente para un servicio OData
Abra un proyecto de aplicación de consola de F# y, a continuación, agregue una referencia al ensamblado System.Data.Services.Client de .NET Framework.
En Extensiones, agregue una referencia al ensamblado FSharp.Data.TypeProviders.
Tener acceso a tipos OData
En este paso creará un proveedor de tipo que proporciona acceso a los tipos y datos de un servicio OData.
Para tener acceso a los tipos OData
En el editor de código, abra un archivo de código fuente de F#, y escriba el código siguiente.
open Microsoft.FSharp.Data.TypeProviders type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc/"> let db = Northwind.GetDataContext() let fullContext = Northwind.ServiceTypes.NorthwindEntities()
En este ejemplo, se ha invocado al proveedor de tipo de F# y se le ha indicado que cree un conjunto de tipos que se basan en el URI de OData especificado. Hay dos objetos disponibles que contienen información sobre los datos; uno es un contexto simplificado de datos, db en el ejemplo. Este objeto contiene únicamente los tipos de datos asociados a la base de datos, que incluyen tipos para las tablas o fuentes de distribución. El otro objeto, fullContext en este ejemplo, es una instancia de DataContext y contiene muchas propiedades, métodos y eventos adicionales.
Consultar un servicio OData
En este paso utilizará las expresiones de consulta de F# para consultar el servicio OData.
Para consultar un servicio OData
Una vez que ha configurado el proveedor de tipo, puede hacer consultas en un servicio OData.
OData solo admite un subconjunto de las operaciones de consulta disponibles. Se admiten las siguientes operaciones y sus palabras clave correspondientes:
Proyección (select)
Filtrado (where, mediante operaciones de cadena y de fecha)
Paginación (skip, take)
Ordenación (orderBy, thenBy)
AddQueryOption y Expand, que son operaciones específicas de OData
Para obtener más información, vea Consideraciones sobre LINQ (WCF Data Services).
Si desea obtener todas las entradas de una fuente o una tabla, utilice la forma más sencilla de expresión de consulta, como se muestra en el código siguiente:
query { for customer in db.Customers do select customer } |> Seq.iter (fun customer -> printfn "ID: %s\nCompany: %s" customer.CustomerID customer.CompanyName printfn "Contact: %s\nAddress: %s" customer.ContactName customer.Address printfn " %s, %s %s" customer.City customer.Region customer.PostalCode printfn "%s\n" customer.Phone)
Especifique los campos o columnas que desea utilizando una tupla después de la palabra clave select.
query { for cat in db.Categories do select (cat.CategoryID, cat.CategoryName, cat.Description) } |> Seq.iter (fun (id, name, description) -> printfn "ID: %d\nCategory: %s\nDescription: %s\n" id name description)
Especifique las condiciones mediante una cláusula where.
query { for employee in db.Employees do where (employee.EmployeeID = 9) select employee } |> Seq.iter (fun employee -> printfn "Name: %s ID: %d" (employee.FirstName + " " + employee.LastName) (employee.EmployeeID))
Especifique una condición de subcadena para la consulta mediante el método Contains. La consulta siguiente devuelve todos los productos cuyo nombre contiene "Chef". Observe también el uso de GetValueOrDefault. UnitPrice acepta valores nulos, por lo que se deberá obtener el valor mediante la propiedad Value o llamando a GetValueOrDefault.
query { for product in db.Products do where (product.ProductName.Contains("Chef")) select product } |> Seq.iter (fun product -> printfn "ID: %d Product: %s" product.ProductID product.ProductName printfn "Price: %M\n" (product.UnitPrice.GetValueOrDefault()))
Utilice el método EndsWith para especificar que una cadena termina con una subcadena determinada.
query { for product in db.Products do where (product.ProductName.EndsWith("u")) select product } |> Seq.iter (fun product -> printfn "ID: %d Product: %s" product.ProductID product.ProductName printfn "Price: %M\n" (product.UnitPrice.GetValueOrDefault()))
Combine condiciones en una cláusula where mediante el operador &&.
// Open this module to use the nullable operators ?> and ?<. open Microsoft.FSharp.Linq.NullableOperators let salesIn1997 = query { for sales in db.Category_Sales_for_1997 do where (sales.CategorySales ?> 50000.00M && sales.CategorySales ?< 60000.0M) select sales } salesIn1997 |> Seq.iter (fun sales -> printfn "Category: %s Sales: %M" sales.CategoryName (sales.CategorySales.GetValueOrDefault()))
Los operadores ?> y ?< aceptan valores nulos. Puede utilizar un conjunto completo de operadores de igualdad y de comparación que aceptan valores nulos. Para obtener más información, vea Linq.NullableOperators (Módulo de F#).
Utilice el operador de consulta sortBy para especificar el orden y thenBy para especificar otro nivel de ordenación. Observe también el uso de una tupla en la parte select de la consulta. Por consiguiente, la consulta tiene una tupla como tipo de elemento.
printfn "Freight for some orders: " query { for order in db.Orders do sortBy (order.OrderDate.Value) thenBy (order.OrderID) select (order.OrderDate, order.OrderID, order.Customer.CompanyName) } |> Seq.iter (fun (orderDate, orderID, company) -> printfn "OrderDate: %s" (orderDate.GetValueOrDefault().ToString()) printfn "OrderID: %d Company: %s\n" orderID company)
Omita un número de registros determinado mediante el operador skip y utilice el operador take para especificar el número de registros que se deben devolver. De esta manera, puede implementar la paginación en las fuentes de distribución de datos.
printfn "Get the first page of 2 employees." query { for employee in db.Employees do take 2 select employee } |> Seq.iter (fun employee -> printfn "Name: %s ID: %d" (employee.FirstName + " " + employee.LastName) (employee.EmployeeID)) printfn "Get the next 2 employees." query { for employee in db.Employees do skip 2 take 2 select employee } |> Seq.iter (fun employee -> printfn "Name: %s ID: %d" (employee.FirstName + " " + employee.LastName) (employee.EmployeeID))
Comprobación de la solicitud OData
Cada consulta OData se convierte en un URI específico de solicitud OData. Puede comprobar dicho URI, quizás para fines de depuración, agregando un controlador de eventos al evento SendingRequest en el objeto de contexto de datos completo.
Para comprobar la solicitud OData
Para comprobar el URI de la solicitud OData, utilice el código siguiente:
// The DataContext property returns the full data context. db.DataContext.SendingRequest.Add (fun eventArgs -> printfn "Requesting %A" eventArgs.Request.RequestUri)
El resultado del código anterior es:
requesting http://services.odata.org/Northwind/Northwind.svc/Orders()?$orderby=ShippedDate&$select=OrderID,ShippedDate
Vea también
Tareas
Referencia
ODataService (Proveedor de tipo de F#)