İzlenecek yol: OData hizmet sağlayıcıları türü (F#) kullanarak erişme
OData, yani Açık Veri Protokolü, Internet üzerinden veri aktarmak için kullanılan bir protokoldür. Birçok veri sağlayıcısı bir OData web hizmeti yayımlayarak verilerine erişim sağlar. F# 3.0 içinde herhangi bir OData kaynağındaki verilere ODataService tür sağlayıcısı tarafından otomatik olarak üretilen veri türlerini kullanarak erişebilirsiniz. OData hakkında daha fazla bilgi için, bkz: Introducing OData.
Bu adım adım kılavuz bir OData hizmetine istemci türler üretmek için F# ODataService tür sağlayıcısını nasıl kullanacağınızı ve hizmetin sağladığı veri beslemelerini nasıl sorgulayacağınızı gösterir.
Bu izlenecek yol, başarılı olması için bu sırayla gerçekleştirmeniz gereken aşağıdaki görevleri gösterir:
Bir OData hizmeti için bir istemci projesi yapılandırma
OData türlerine erişme
Bir OData hizmetini sorgulama
OData isteğini doğrulama
Bir OData hizmeti için bir istemci projesi yapılandırma
Bu adımda, bir OData tür sağlayıcısı kullanmak için bir proje ayarlarsınız.
Bir OData hizmeti için bir istemci projesi ayarlamak için
Bir F# Konsol Uygulaması projesi açın, ve ardından System.Data.Services.Client Framework derlemesine bir başvuru ekleyin.
Uzantılar altında, FSharp.Data.TypeProviders derlemesine bir başvuru ekleyin.
OData türlerine erişme
Bu adımda, bir OData hizmeti için türlere ve veriye erişimi sağlayan bir tür sağlayıcısı oluşturursunuz.
OData türlerine erişmek için
Kod Düzenleyicisi içinde, bir F# kaynak dosyası açın, ve aşağıdaki kodu girin.
open Microsoft.FSharp.Data.TypeProviders type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc/"> let db = Northwind.GetDataContext() let fullContext = Northwind.ServiceTypes.NorthwindEntities()
Bu örnekte, F# tür sağlayıcısını çağırdınız ve belirttiğiniz OData URI'yi temel alan bir türler kümesi oluşturması için talimat verdiniz. Veri ile ilgili bilgi içeren kullanılabilir iki nesne vardır: biri bir basitleştirilmiş veri bağlamıdır, örnekte db. Bu nesne yalnızca veritabanı ile ilgili veri türlerini içerir, ve tablolar ve beslemeler için türleri içerir. Diğer nesne, bu örnekte fullContext, bir DataContext örneğidir ve pek çok ek özellikler, yöntemler ve olaylar içerir.
Bir OData hizmetini sorgulama
Bu adımda, OData hizmetini sorgulamak için F# sorgu iadelerini kullanırsınız.
Bir OData hizmetini sorgulamak için
Tür sağlayıcısını ayarladığınıza göre, artık bir OData hizmetini sorgulayabilirsiniz.
OData kullanılabilir sorgu işlemlerinin yalnızca bir altkümesini destekler. Aşağıdaki işlemler ve onlara karşılık gelen anahtar sözcükler desteklenir:
projeksiyon (select)
filtre uygulama (where, dize ve tarih işlemleri kullanarak)
sayfalama (skip, take)
sıralama (orderBy, thenBy)
OData'ya özel işlemler olan AddQueryOption ve Expand
Daha fazla bilgi için bkz. LINQ Considerations.
Eğer bir besleme ya da tablo içindeki tüm girdileri istiyorsanız, sorgu ifadesinin en basit biçimini kullanın, aşağıdaki koddaki gibi:
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 anahtar sözcüğünden sonra bir veri grubu kullanarak istediğiniz alanları ya da sütunları belirtin.
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)
Bir where yan tümcesi kullanarak koşulları belirtin.
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 yöntemini kullanarak sorguya bir altdize koşulu belirtin. Aşağıdaki sorgu adında "Chef" olan tüm ürünleri döndürür. Ayrıca GetValueOrDefault kullanımına dikkat edin. UnitPrice null olabilen bir değerdir, bu nedenle değeri ya Value özelliğini kullanarak almalısınız, ya da GetValueOrDefault çağırmalısınız.
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()))
Bir dizenin belirli bir altdize ile bittiğini belirtmek için EndsWith yöntemini kullanın.
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()))
&& işlecini kullanarak bir where yan tümcesi içinde koşulları birleştirin.
// 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()))
?> ve ?< işleçleri null olabilen işleçlerdir. Null olabilen eşitlik ve karşılaştırma işleçlerinin tam bir kümesini kullanabilirsiniz. Daha fazla bilgi için bkz. Linq.NullableOperators Modülü (F#).
Sıralama belirtmek için sortBy sorgu işlecini kullanın, ve başka bir sıralama düzeyi belirtmek için thenBy kullanın. Sorgunun seçili kısmı içindeki bir veri grubu kullanımına da dikkat edin. Bu nedenle, sorgu bir öğe türü olarak bir veri grubuna sahiptir.
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)
skip işlecini kullanarak belirli bir sayıda kaydı yok sayın, ve take işlecini kullanarak döndürülecek kayıt sayısını belirtin. Bu şekilde, veri beslemeleri üzerinde sayfalama uygulayabilirsiniz.
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 isteğini doğrulama
Her OData sorgusu belirli bir OData istek URI olarak çevrilir. Bu URI'yı, belki hata ayıklama amacıyla, tam veri bağlamı nesnesi üzerindeki SendingRequest olayına bir olay işleyicisi ekleyerek doğrulayabilirsiniz.
OData isteğini doğrulamak için
OData istek URI'sını doğrulamak için, aşağıdaki kodu kullanın:
// The DataContext property returns the full data context. db.DataContext.SendingRequest.Add (fun eventArgs -> printfn "Requesting %A" eventArgs.Request.RequestUri)
Önceki kodun çıktısı:
Ayrıca bkz.
Görevler
Başvuru
ODataService türü sağlayıcı (F#)