Sdílet prostřednictvím


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

  1. 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)
    
  2. 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)
    
  3. 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))                         
    
  4. 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()))
    
  5. 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()))
    
  6. 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#).

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

Dotazovací výrazy (F#)

Referenční dokumentace

Zprostředkovatel ODataService typu (F#)

Další zdroje

LINQ Considerations