I když jsme si v minulých dílech ukázali základní operace práci s daty, používat sockety, TcpClient objekt či podobná řešení a skládat data ručně by bylo silně kontraproduktivní. Celý produkt by zřejmě zmiznul v zapomnění. Samozřejmě to Microsoft nechce, a proto máme možnost data konzumovat a posílat mnohem kulturnějším způsobem.
reklama
I když jsme si v minulých dílech ukázali základní operace práci s daty, používat sockety, TcpClient objekt či podobná řešení a skládat data ručně by bylo silně kontraproduktivní. Celý produkt by zřejmě zmiznul v zapomnění. Samozřejmě to Microsoft nechce, a proto máme možnost data konzumovat a posílat mnohem kulturnějším způsobem.
První co můžete udělat je využít tříd DataServiceContext a DataServiceQuery. Bohužel tento postup je jen lehkou abstrakcí. Nicméně i tak má své výhody, např. v možnosti vše předávat jako řetězce a tedy libovolně skládat. Na druhou stranu je zapotřebí napsat strukturu entit do naší aplikace ručně, což není zrovna pohodlné.
static void Main(string[] args)
{
DataServiceContext ctx = new DataServiceContext(new Uri(@"http://localhost:2634/MyDataService.svc"));
DataServiceQuery<b> bs = ctx.CreateQuery<b>(@"/b?$filter=id lt 100");
foreach (b item in bs)
{
Console.WriteLine("ID: {0} \t Y: {1}", item.id, item.y);
}
Console.ReadKey();
}
class b
{
public int id { get; set; }
public string y { get; set; }
}
Mnohem pohodlnější je nechat si určitou část kódu vygenerovat z metadat a s těmito „kameny“ pak vystavět výsledek. Pro tento případ se nachází v instalaci nástroj DataSvcUtil (dříve pojmenovaný WebDataGen). S tímto nástrojem můžete lehce vygenerovat ze služby třídy (a další pomocné objekty) a nad nimi používat např. LINQ.
>DataSvcUtil /out:MyService.cs /uri:http://localhost:2634/MyDataService.svc
Výše uvedený příkaz nám vytvoří soubor MyService.cs (je možné vygenerovat i VB.NET) ze služby na zadaném URI. Vzhledem k tomu, že ADO.NET Data Services stojí nad Entity Frameworkem, je možné předat i EDMX nebo CSDL soubor. K nim však nemusíte mít vždy přístup. Vygenerovaný soubor stačí přidat do projektu a začít využívat. Ekvivalent výše uvedeného kódu by mohl vypadat takto:
MyEntities e = new MyEntities(new Uri(@"http://localhost:2634/MyDataService.svc"));
var query = from x in e.b
where x.id < 100
select x;
foreach (b item in query)
{
Console.WriteLine("ID: {0} \t Y: {1}", item.id, item.y);
}
Nejen, že výše uvedený kód je přehlednější, je také typovaný, takže máte mnohem větší kontrolu vzniknuvších chyb již během kompilace. A jako bonus; v debuggeru si můžete prohlédnout, jak vypadá výsledný dotaz – použité operátory apod.

Podobně jako v Entity Frameworku, chcete-li přistupovat na vlastnosti asociovaných entit, je třeba tyto načíst. Pro ADO.NET Data Services se metoda nejmenuje Load jako v Frameworku, nýbrž LoadProperty.
foreach (b item in query)
{
Console.WriteLine("ID: {0} \t Y: {1}", item.id, item.y);
e.LoadProperty(item, "base");
foreach (var item2 in item.@base)
{
Console.WriteLine("\t {0}", item2.name);
}
}
S výše uvedeným kódem souvisí jeden problém a to je právě načítání asociovaných entit až ve chvíli, kdy je potřebujeme. Pokud bychom „zkoumali“ jen jednu entitu, není to kritický problém. Nicméně pokud procházíme vetší množství entit, budeme jednak zbytečně zatěžovat server, a jednak zpomalovat aplikaci kvůli (síťovým) round-tripům. Žel přímo pomocí LINQu není možné operátor $expand použít, a je třeba vzít za vděk zápisem jako řetězec (objekty jsou automaticky materializovány). Avšak podpora pro LINQ se chystá.
Stejně jako v předchozích dílech, ani dnes nemůžeme pokračovat jinak, než pohledem na změny dat. Změna dat je díky vygenerovaným třídám velmi jednoduchá a jde vlastně jen o změny v jednotlivých vlastnostech a označení této entity k zpracování (updatu).
foreach (b item in query)
{
item.y = "_" + item.y;
e.UpdateObject(item);
}
e.SaveChanges();
Smazání dat je podobně jednoduché.
foreach (b item in query)
{
if (item.id > 7)
{
e.DeleteObject(item);
}
}
Pro přidání nové entity využijeme metod AddTo...
e.AddTob(new b() { y = "RRR" });
e.SaveChanges();
Představím-li si, že během několika málo minut/hodin mohu napsat aplikaci, která získává a mění data z webové služby někde na druhém konci světa (kterou druhý programátor vytvořil možná ještě rychleji než já aplikaci), a přitom pracovat v kódu, s objekty, de facto odstíněn od síťové komunikace, obalování do XML/JSON apod., nelze než souhlasit, že v určitých případech nám ADO.NET Data Services mohou ušetřit práci.