Názorný postup: Přístupu služby OData typ zprostředkovatele (F#)
OData, což znamená Open Data Protocol, je protokol pro přenos dat přes Internet.Mnoho poskytovatelů dat umožňují přístup ke svým datům publikováním webové služby OData.K datům z libovolného zdroje OData lze přistoupit pomocí jazyka F# 3.0 za použití datových typů automaticky generovaných poskytovatelem typů ODataService.Další informace o protokolu OData naleznete v tématu Introducing OData.
Tento návod ukazuje, jak využít poskytovatele typů ODataService jazyka F# k vygenerování typů klienta služby OData a dotázat se na datové kanály, které služba poskytuje.
Tento návod popisuje následující úkoly, které je zapotřebí pro správnou činnost provést v uvedeném pořadí:
Konfigurace projektu klienta pro službu OData
Přístup k typům OData
Dotazování služby OData
Ověření požadavku OData
Konfigurace projektu klienta pro službu OData
V tomto kroku nastavíte projekt tak, aby používat poskytovatele typů OData.
Konfigurace projektu klienta pro službu OData
Otevřete projekt Aplikace konzoly v jazyce F# a přidejte odkaz na sestavení rozhraní System.Data.Services.Client.
V oddílu Rozšíření přidejte odkaz na sestavení FSharp.Data.TypeProviders.
Přístup k typům OData
V tomto kroku vytvoříte poskytovatele typů, který poskytuje přístup k typům a datům pro službu OData.
Přístup k typům OData
V Editoru kódu otevřete zdrojový soubor jazyka F# a zadejte následující kód.
open Microsoft.FSharp.Data.TypeProviders type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc/"> let db = Northwind.GetDataContext() let fullContext = Northwind.ServiceTypes.NorthwindEntities()
V tomto příkladu došlo k zavolání poskytovatele typů F# a jeho využít pro vytvoření sady typů založených na zadané adrese URI služby OData.Jsou k dispozici dva objekty obsahující informace o datech; jeden z nich představuje zjednodušený kontext dat, v příkladu db.Tento objekt obsahuje pouze datové typy související s databází, včetně typů pro tabulky a kanály.Druhý objekt, v tomto příkladu fullContext, je instance objektu DataContext a obsahuje mnoho dalších vlastností, metod a událostí.
Dotazování služby OData
V tomto kroku využijete dotazovacího výrazu jazyka F# pro dotazování služby OData.
Dotaz na službu OData
Nyní lze po nastavení poskytovatele typů vytvořit dotaz na službu OData.
Protokol OData podporuje pouze podmnožinu dostupných dotazovacích operací.Podporovány jsou následující operace a jejich příslušná klíčová slova:
projekce (select)
filtrování (where, za použití operací řetězců a dat)
stránkování (skip, take)
řazení (orderBy, thenBy)
Operace AddQueryOption a Expand, které jsou specifické pro protokol OData
Další informace naleznete v tématu LINQ Considerations.
Chcete-li načíst všechny záznamy kanálu nebo tabulky, použijte nejjednodušší formu dotazovacího výrazu, jak ukazuje následující kód:
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)
Požadované pole a sloupce lze určit použitím n-tice za klíčovým slovem 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)
Pomocí klauzule where lze zadat podmínky.
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))
Metodou Contains lze dotazu zadat podmínky podřetězce.Následující dotaz vrací všechny produkty, které mají ve svém názvu řetězec "Chef".Povšimněte si také využití metody GetValueOrDefault.Proměnná UnitPrice je hodnota s možnou hodnotou null, tudíž je zapotřebí hodnotu načíst pomocí vlastnosti Value nebo zavoláním metody 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()))
Chcete-li zadat, že řetězec končí určitým podřetězcem, použijte metodu 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()))
Podmínky v klauzuli where lze kombinovat použitím operátoru &&.
// 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()))
Operátory ?> a ?< mohou být nastaveny na hodnotu null.K dispozici je úplná sada operátorů rovnosti a porovnání nastavitelných na hodnotu null.Další informace naleznete v tématu LINQ.NullableOperators modul (F#).
Chcete-li určit řazení, použijte dotazový operátor sortBy. Poté lze použít operátor thenBy pro určení další úrovně třídění.Povšimněte si také využití n-tice v části select.Dotaz má tudíž n-tici jako typ prvku.
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)
Určitý počet záznamů lze ignorovat použitím operátoru skip, operátorem take lze naopak určit, kolik záznamů má být vráceno.Tímto způsobem lze implementovat stránkování v datových kanálech.
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))
Ověření požadavku OData
Každý dotaz OData je přeložen do určité adresy URI požadavku OData.Tuto adresu URI lze ověřit, například pro účely ladění, přidáním obslužné rutiny události do události SendingRequest v objektu úplného datového kontextu.
Ověření požadavku OData
Chcete-li ověřit adresu URI požadavku OData, použijte následující kód:
// The DataContext property returns the full data context. db.DataContext.SendingRequest.Add (fun eventArgs -> printfn "Requesting %A" eventArgs.Request.RequestUri)
Výstup předchozího kódu je:
requesting http://services.odata.org/Northwind/Northwind.svc/Orders()?$orderby=ShippedDate&$select=OrderID,ShippedDate
Viz také
Úkoly
Referenční dokumentace
Zprostředkovatel ODataService typu (F#)