Поделиться через


Пошаговое руководство. Доступ к службе OData с помощью поставщиков типов (F#)

OData (аббревиатура от Open Data Protocol) - это протокол передачи данных в Интернете.Многие поставщики данных предоставляют доступ к своим данным путем публикации веб-службы OData.Можно получить доступ к данным из любого источника OData в F# 3.0, используя типы данных, которые автоматически создаются поставщиком типа ODataService.Дополнительные сведения о OData см. в разделе Introducing OData.

В этом пошаговом руководстве показано, как использовать поставщика типов F# ODataService для создания типов клиента для службы OData и каналы данных очередей, которые предоставляет служба.

В этом пошаговом руководстве проиллюстрированы следующие задачи, которые должны выполняться для успешного выполнения в порядке, указанном в пошаговом руководстве.

  • Настройка проекта клиента для службы OData

  • Доступ к типам OData

  • Запросы к службе OData

  • Проверка запроса OData

Настройка проекта клиента для службы OData

На данном этапе происходит настройка проекта для использования поставщика типа OData.

Настройка проекта клиента для службы OData

  • Откройте проект консольного приложения F#, а затем добавьте ссылку на сборку System.Data.Services.Client .NET Framework.

  • В Расширения добавьте ссылку на сборку FSharp.Data.TypeProviders.

Доступ к типам OData

На данном этапе создается поставщик типа, предоставляющий доступ к типам и данным для службы OData.

Доступ к типам OData

  • В редакторе кода откройте исходный файл F# и введите следующий код.

    open Microsoft.FSharp.Data.TypeProviders
    
    
    type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc/">
    
    let db = Northwind.GetDataContext()
    let fullContext = Northwind.ServiceTypes.NorthwindEntities()
    

    В этом примере был вызван поставщик типов F# и он получил инструкции для создания набора типов, основанных на указанном OData URI.Доступны два объекта, содержащие сведения о данных; одни являются упрощенным контекстом данных, db в примере.Этот объект содержит только типы данных, связанные с базой данных, включая типы таблиц или каналов.Другой объект, fullContext в этом примере, является экземпляром DataContext и содержит множество дополнительных свойств, методов и событий.

Запросы к службе OData

На данном этапе необходимо использовать выражения запросов F#, чтобы запросить службу OData.

Запросить службу OData

  1. Теперь, когда вы настроили поставщика типов, можно запросить службу OData.

    OData поддерживает только подмножество доступных операций запроса.Следующие операции и соответствующие ключевые слова поддерживаются:

    • проекция (select)

    • фильтрация (where с помощью операций строк и дат)

    • разбиение по страницам (skip, take)

    • упорядочивание (orderBy, thenBy)

    • AddQueryOption и Expand, которые являются операциями OData

    Дополнительные сведения см. в разделе LINQ Considerations.

    Если необходимо, чтобы все записи находились в потоке или таблице, то используйте самую простую форму выражения запроса, как показано в следующем коде:

    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. Определите поля или столбцы, которые вам нужны, с помощью кортежа после ключевого слова 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. Укажите условие с помощью предложения 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. Укажите условие подстроки к запросу с помощью метода Contains.Следующий запрос возвращает все продукты, имеющие «шеф-повара» в своих именах.Также обратите внимание на использование GetValueOrDefault.Значение UnitPrice допускает значения null, поэтому значение можно получить либо с помощью свойства Value, либо необходимо вызвать 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. Используйте метод EndsWith, чтобы указать, что строка заканчивается некоторой подстрокой.

    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. Объединяйте условия в предложение where с помощью оператора &&.

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

    Операторы ?> и ?< допускают значение null.Можно использовать полный набор операторов равенства и сравнения, допускающих значение null.Дополнительные сведения см. в разделе Модуль Linq.NullableOperators (F#).

  7. Используйте оператор запроса sortBy, чтобы определить упорядочение, и используйте thenBy, чтобы указать другой уровень упорядочения.Также обратите внимание на использование кортежа в части select запроса.Поэтому запрос имеет кортеж в качестве типа элемента.

    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. Проигнорируйте указанное количество записей с помощью оператора пропуска, и используйте оператор взятия, чтобы указать число записей для возврата.Таким образом можно реализовать подкачку в потоке данных.

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

Проверка запроса OData

Каждый запрос OData преобразуется в указанный URI запроса OData.Можно проверить этот URI, возможно для отладки, добавив обработчик события к событию SendingRequest в полном объекте контекста данных.

Проверка запроса OData

  • Для проверки URI запроса OData, используйте следующий код:

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

    Результат выполнения приведенного выше кода:

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

См. также

Задачи

Выражения запросов (F#)

Ссылки

Поставщик типов ODataService (F#)

Другие ресурсы

LINQ Considerations