Tutorial: Obtener acceso a un servicio OData mediante proveedores de tipo (F#)

OData, que significa Open Data Protocol, es un protocolo de 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 fuente OData en F# 3.0 utilizando los tipos de datos que se generan automáticamente mediante el proveedor de tipos ODataService.Para obtener más información sobre OData, consulte Introducing OData.

Este tutorial muestra cómo utilizar el proveedor de tipos ODataService de F# para generar los tipos de cliente para servicios OData y para las fuentes de datos de consulta que el servicio proporciona.

Este tutorial muestra las tareas que siguen a continuación y que se deben realizar en el orden en que aparecen para que el tutorial se realice correctamente:

  • Configuración de un proyecto cliente para un servicio OData

  • Acceder a tipos OData

  • Consultar un servicio OData

  • Comprobación de la solicitud OData

Configuración de un proyecto cliente para un servicio OData

En este paso se onfigurará un proyecto para que utilice un proveedor de tipos OData.

Cómo configurar un proyecto cliente para un servicio OData

  • Abra un proyecto de aplicación de consola de F#, y agregue una referencia al ensamblado del Framework System.Data.Services.Client.

  • Bajo Extensiones, agregue una referencia al ensamblado FSharp.Data.TypeProviders .

Acceder a tipos OData

En este paso se creará un proveedor de tipos que proporcione acceso a los tipos y datos de un servicio OData.

Cómo tener acceso a los tipos OData

  • En el editor de código, abra un archivo de código fuente de F#, e inserte el siguiente código.

    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 tipos de F# y se le ha especificado que cree un conjunto de tipos que se basan en el URI de OData especificado.Hay disponibles dos objetos 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.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 se utilizan las expresiones de consulta de F# para consultar el servicio de OData.

Cómo consultar un servicio OData

  1. Una vez que se ha configurado el proveedor de tipos, se pueden hacer consultas sobre un servicio de 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)

    • ordenamiento (orderBy, thenBy)

    • AddQueryOption y Expand que son operaciones específicas de OData

    Para obtener más información, vea LINQ Considerations.

    Si se desean todas las entradas de una fuente o una tabla, entonces se utiliza la forma más sencilla de expresión de consulta, tal como la que se muestra en el siguiente código:

    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)
    
  2. 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)
    
  3. 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))                         
    
  4. Especifique una condición de subcadena para la consulta mediante el método Contains.La siguiente consulta devuelve todos los productos que tienen “Chef” en su nombre.Observe también el uso de GetValueOrDefault.El UnitPrice es un valor que acepta nulos, por lo que se deberá obtener el valor bien mediante la propiedad Value o se deberá llamar 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()))
    
  5. 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()))
    
  6. Combine las 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 ?< son operadores que aceptan valores nulos.Se puede utilizar un conjunto completo de operadores de igualdad que acepten nulos y de comparación.Para obtener más información, vea Linq.NullableOperators (Módulo de F#).

  7. Utilice el operador de consulta sortBy para especificar el orden y thenBy para especificar otro nivel de clasificació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)
    
  8. 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,se puede implementar la paginación en las fuentes 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 concreto de la solicitud de OData .Se 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.

Cómo comprobar la solicitud de OData

  • Para comprobar el URI de la solicitud de OData, utilice el siguiente código:

        // The DataContext property returns the full data context.
        db.DataContext.SendingRequest.Add (fun eventArgs -> printfn "Requesting %A" eventArgs.Request.RequestUri)
    

    La salida del código anterior es:

requesting http://services.odata.org/Northwind/Northwind.svc/Orders()?$orderby=ShippedDate&$select=OrderID,ShippedDate

Vea también

Tareas

Expresiones de consulta (F#)

Referencia

ODataService (Proveedor de tipo de F#)

Otros recursos

LINQ Considerations