Galin Iliev

Software Architecture & Development

LINQ to DataSet

LINQ to DataSet представлява възможност да се пишат заявки към обекти, съдържащи се в DataSet – това са познатите ни обекти от ADO.NET – DataTable, DataView, DataRow. Реално много прилича на LINQ to Objects, защото все пак работим с обекти. Това ни позволява да напишем следната заявка):

Northwind.ProductsDataTable productsTable = new Northwind.ProductsDataTable();

 

var products = from dr in productsTable

               where dr.CategoriesRow.CategoryName == "Seafood"

               select dr;

 Забележете, че тук връзките между таблиците остават както в нормален обект от тип DataSet, така че имаме достъп до parent обекта чрез свойството CategoriesRow. Обектите dr и CategoriesRow са наследници на класа DataRow. Още една малка подробност: за свойствата на обект от тип DataRow е характерно, че get може да хвърли изключение, което от своя страна не е добра практика за работа с LINQ. Затова е добре да използваме метода DataRow.IsNull() при работа със свойства на DataRow в LINQ to DataSet.

На пръв поглед това подобрение не е голямо, но самата комбинация на DataSet класовете с възможностите на LINQ дава много възможности, които ги няма при работа само с DataSet класовете. Ето някои от тях:

·         Създаване на заявка, като резултата връща нова колона, която съдържа изчисление

·         Създаване на изглед в смисъла на SQL Server – съдържащ колони от няколко таблици и др.

Ако погледнем следната диаграма[7], ще видим класовете от асемблито System.Data.DataSetExtensions.dll, които подпомагат реализацията на LINQ to DataSet:

За да увеличите снимката щракнете върху нея

Както казахме и по-горе, LINQ заявката се преобразува до разширяващи методи, и затова нека погледнем какви разширяващи методи са създадени към типовете от ADO.NET. Следната диаграма[7] показва дефиницията на тези методи, които правят LINQ to DataSet възможно:

За да увеличите снимката щракнете върху нея

 

Следваща част: LINQ to XML

Content