Пошаговое руководство. Доступ к службе 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
Теперь, когда вы настроили поставщика типов, можно запросить службу OData.
OData поддерживает только подмножество доступных операций запроса. Следующие операции и соответствующие ключевые слова поддерживаются:
проекция (select)
фильтрация (where с помощью операций строк и дат)
разбиение по страницам (skip, take)
упорядочивание (orderBy, thenBy)
AddQueryOption и Expand, которые являются операциями OData
Для получения дополнительной информации см. Рекомендации по LINQ (службы WCF Data Services).
Если необходимо, чтобы все записи находились в потоке или таблице, то используйте самую простую форму выражения запроса, как показано в следующем коде:
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)
Определите поля или столбцы, которые вам нужны, с помощью кортежа после ключевого слова 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)
Укажите условие с помощью предложения 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))
Укажите условие подстроки к запросу с помощью метода 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()))
Используйте метод 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()))
Объединяйте условия в предложение 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#).
Используйте оператор запроса 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)
Проигнорируйте указанное количество записей с помощью оператора пропуска, и используйте оператор взятия, чтобы указать число записей для возврата. Таким образом можно реализовать подкачку в потоке данных.
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)
Результат выполнения приведенного выше кода:
запрос http://services.odata.org/Northwind/Northwind.svc/Orders()? $orderby=ShippedDate$select=OrderID&, ShippedDate
См. также
Задачи
Ссылки
Поставщик типов ODataService (F#)