Dim customers As List(Of Customer) = GetCustomerList()
Dim customersByCountry = From cust In customers _
Order By cust.Country, cust.City _
Group By CountryName = cust.Country _
Into RegionalCustomers = Group, Count() _
Order By CountryName
For Each country In customersByCountry
Console.WriteLine(country.CountryName & _
" (" & country.Count & ")" & vbCrLf)
For Each customer In country.RegionalCustomers
Console.WriteLine(vbTab & customer.CompanyName & _
" (" & customer.City & ")")
Next
Next
مزودات Linq - LINQ Providers
يقوم مزود Linq بتنظيم استعلامات Linq في فيجول بايزيك بحسب مصدر البيانات الذي تستخدمه فعندما تكتب استعلام Linq يأخذ المزود ذلك الاستعلام ويترجمه إلى أوامر يستطيع مصدر البيانات تنفيذها ويقوم أيضا بتحويل البيانات من الأغراض المصدرية ليشكل نتائج الاستعلام وأخيرا يقوم بتحويل الأغراض إلى بيانات عندما ترسل التحديثات للمصدر. ويضم فيجول بايزيك مزودات Linq التالية:
· Linq to Objects يمكنك هذا المزود من الاستعلام في المجموعات والمصفوفات في الذاكرة إذا كانت غرضك يدعم الواجهة IEnumerable أو الواجهة IEnumerable(T) بحيث يمكنك المزود من الاستعلام عنها ويمكنك تمكين هذا المزود باستيراد المجال System.Linq والذي يكون مستوردا بشكل افتراضي في مشاريع فيجول بايزيك
· Linq to SQL يمكنك هذا المزود من الاستعلام من قواعد بيانات SQL Server والتحديث إليها ويجعل من السهل ربط أغراض التطبيق مع الجداول والأغراض في قواعد البيانات. ويسهل فيجول بايزيك العمل مع Linq to SQL بتقديم Object Relational Designer والذي يمكنك من إنشاء Object Model في التطبيق يرتبط مع الأغراض في قاعدة البيانات ويقدم الـ O/R Designer إمكانية التعامل مع الإجراءات والوظائف المخزنة وإجراءات الغرض DataContext الذي يدير الاتصال مع قاعدة البيانات ويخزن الحالة من أجل تصادم البيانات التفاؤلي
· Linq to Xml يمكنك من الاستعلام من Xml والتعديل عليها بحيث يمكنك تعديل محتويات Xml الموجودة في الذاكرة أو يمكنك تحميل ملف Xml أو حفظه
· Linq to Dataset يمكنك من الاستعلام من ADO .net Datasets والتعديل عليها وإضافة قوة Linq للتطبيقات التي تستخدم Datasets تسهل وتوسع إمكانيات الاستعلام والتجميع والتحديث في الـ Dataset في تطبيقك
بنية استعلام Linq - The Structure of a LINQ Query
يشار عادة إلى استعلام Linq بتعبير الاستعلام وهو يتألف من توليفة من تراكيب الاستعلام التي تحدد مصدر البيانات ومتغيرات التكرار الخاصة بالاستعلام كما يمكنه أن يتضمن تعليمات من أجل الفرز أو التصفية أو التجميع أو الضم أو الحساب ليتم تطبيقها على البيانات المصدرية وصيغتها تكون مشابهة لصيغة الـ SQL ولهذا ستجد أن معظم الصيغة مألوفة.
يبدأ الاستعلام بقسم From الذي يحدد مصدر البيانات والمتغيرات التي تشير إلى كل عنصر من البيانات المصدرية بشكل مستقل وهي تدعى بمتغيرات المجال أو متغيرات التكرار وقسم From مطلوب من أجل الاستعلام إلا في استعلامات التجميع Aggregate حيث يكون قسم From فيها اختياري وبعد تعريف مجال ومصدر الاستعلام في قسم From أو في قسم Aggregate يمكنك تضمين أي تركيب من أقسام الاستعلام. فمثلا الاستعلام التالي يحدد مصدر مجموعة من بيانات الزبائن بالمتغير Customers ومتغير التكرار cust
Dim queryResults = From cust In customers _
Select cust.CompanyName
وهذا المثال يشكل استعلام مقبول بذات نفسه ومع ذلك يصبح الاستعلام أقوى عندما تضيف أقسام استعلام أخرى لتحديد النتائج فمثلا يمكنك إضافة قسم Where لتصفية النتائج إلى قيمة أو أكثر وتكون تعابير الاستعلام عبارة عن سطر واحد من الكود بحيث يمكنك إضافة أقسام استعلام جديدة لنهاية الاستعلام كما يمكنك فصل الاستعلام إلى عدة أسطر لتحسين قراءة كودك باستخدام المحرف _ ويمثل الكود التالي استعلاما يستخدم قسم Where
Dim queryResults = From cust In customers _
Where cust.Country = "USA"
ويمثل قسم select قسم قوي آخر في الاستعلام حيث يمكنك من إعادة الحقول المختارة فقط من مصدر البيانات وتعيد استعلامات Linq مجموعة تعدادية من الأغراض القوية النوع كما يمكنها إعادة أنواع مجهولة أو أنواع معروفة. ويمكن استخدام قسم select للعودة بحقل واحد فقط من مصدر البيانات وعندما تفعل هذا يكون نوع المجموعة المعادة هو نوع بيانات ذلك الحقل. وعندما يعيد قسم Select مجموعة من الحقول من مصدر البيانات تكون المجموعة المعادة من النوع المجهول ويمكنك مطابقة الحقول المعادة من الاستعلام مع حقول من نوع معروف محدد ويظهر الكود التالي تعبير استعلام يعيد مجموعة نوعها مجهول تضم أرقاما مع بيانات من الحقل المحدد من مصدر البيانات
Dim queryResults = From cust In customers _
Where cust.Country = "USA" _
Select cust.CompanyName, cust.Country
يمكن استخدام استعلامات Linq لدمج عدة مصادر من البيانات في نتيجة واحدة حيث يمكن عمل هذا باستخدام قسم From واحد أو أكثر أو باستخدام أقسام Join أو Group Join ويظهر الكود التالي تعبير استعلام يضم بيانات Customer و Order ويعيد مجموعة من نوع مجهول تحتوي بيانات من Customer و Order
Dim queryResults = From cust In customers, ord In orders _
Where cust.CustomerID = ord.CustomerID _
Select cust, ord
يمكنك استخدام قسم Group Join لبناء استعلامات شجرية تحتوي مجموعة من أغراض Customer وكل غرض Customer يمتلك خاصية تحتوي مجموعة تتضمن جميع أغراض order لذلك الزبون. ويظهر المثال التالي تعبير استعلام يدمج بيانات Customer و Order كنتيجة شجرية ويعيد مجموعة من نوع مجهول ويعيد الاستعلام نوعا يتضمن الخاصية CustomerOrders تحتوي على مجموعة تحتوي على مجموعة من بيانات Order وبيانات Customer وتتضمن أيضا الخاصية OrderTotal تحتوي على مجموع إجمالي الطلبات لذلك الزبون
Dim queryResults = From cust In customers _
Group Join ord In orders On _
cust.CustomerID Equals ord.CustomerID _
Into CustomerOrders = Group, _
OrderTotal = Sum(ord.Total) _
Select cust.CompanyName, cust.CustomerID, _
CustomerOrders, OrderTotal
معاملات استعلام Linq - Visual Basic LINQ Query Operators
تتضمن الفئات في المجال System.Linq والمجالات التي تدعم Linq طرائق يمكنك استدعاؤها لإنشاء الاستعلامات وتوليها بحسب حاجة التطبيق ويتضمن فيجول بايزيك كلمات مفتاحية لأقسام الاستعلام الشائعة
From Clause
يجب أن يبدأ الاستعلام بقسم From أو Aggregate ويحدد قسم From المجموعة المصدر أو متغير التكرار للاستعلام
' Returns the company name for all customers for whom
' State is equal to "WA".
Dim names = From cust In customers _
Where cust.State = "WA" _
Select cust.CompanyName
Select Clause
اختياري يحدد مجموعة من متغيرات التكرار للاستعلام
' Returns the company name and ID value for each
' customer as a collection of a new anonymous type.
Dim customerList = From cust In customers _
Select cust.CompanyName, cust.ID
و إن لم يكن قسم Select موجودا في الاستعلام فتتألف متغيرات التكرار للاستعلام من تلك المحددة في قسم From أو Aggregate
Where Clause
اختياري ويحدد شرط التصفية للاستعلام
' Returns all product names for which the Category of
' the product is "Beverages".
Dim names = From product In products _
Where product.Category = "Beverages" _
Select product.Name
Order By Clause
اختياري ويحدد ترتيب الفرز للأعمدة في الاستعلام
' Returns a list of books sorted by price in
' ascending order.
Dim titlesAscendingPrice = From b In Books _
Order By b.Price
Join Clause
اختياري ويدمج مجموعتين ضمن مجموعة واحدة
' Returns a list of books sorted by price in
' ascending order.
Dim titlesAscendingPrice = From b In Books _
Order By b.Price
Group by Clause
اختياري ويقوم بتجميع عناصر نتيجة الاستعلام ويمكن استعماله لتطبيق إجراءات تجميع لكل مجموعة
' Returns a list of orders grouped by the order date
' and sorted in ascending order by the order date.
Dim orders = From order In orderList _
Order By order.OrderDate _
Group By OrderDate = order.OrderDate _
Into OrdersByDate = Group
Group Join Clause
اختياري ويجمع مجموعتين ضمن مجموعة شجرية واحدة
' Returns a combined collection of customers and
' customer orders.
Dim customerList = From cust In customers _
Group Join ord In orders On _
cust.CustomerID Equals ord.CustomerID _
Into CustomerOrders = Group, _
OrderTotal = Sum(ord.Total) _
Select cust.CompanyName, cust.CustomerID, _
CustomerOrders, OrderTotal
Aggregate Clause
يجب بدء الاستعلام دوما إما بقسم From أو قسم Aggregate وقسم Aggregate يطبق واحدة أو أكثر من وظائف التجميع على المجموعة فمثلا يمكن استخدام قسم Aggregate لحساب مجموع جميع العناصر المعادة بالاستعلام
' Returns the sum of all order totals.
Dim orderTotal = Aggregate order In Orders _
Into Sum(order.Total)
كما يمكنك استخدام قسم Aggregate لتعديل الاستعلام فمثلا يمكن استخدام قسم Aggregate لإجراء عملية حسابية على مجموعة استعلام
' Returns the customer company name and largest
' order total for each customer.
Dim customerMax = From cust In customers _
Aggregate order In cust.Orders _
Into MaxOrder = Max(order.Total) _
Select cust.CompanyName, MaxOrder
Let Clause
اختياري ويقوم بحساب قيمة ويضعها في متغير جديد
' Returns a list of products with a calculation of
' a ten percent discount.
Dim discountedProducts = From prod In products _
Let Discount = prod.UnitPrice * 0.1 _
Where Discount >= 50 _
Select prod.ProductName, prod.UnitPrice, Discount
Distinct Clause
اختياري وهو يضبط القيم المعادة من الاستعلام بحيث لا يجلب قيما مكررة
' Returns a list of cities with no duplicate entries.
Dim cities = From item In Customers _
Select customer.City_
Distinct
Skip Clause
اختياري يتجاوز عددا معينا من العناصر في المجموعة ويعيد الباقي
' Returns a list of customers. The first 10 customers
' are ignored and the remaining customers are
' returned.
Dim customerList = From cust In customers _
Skip 10
Skip While Clause
اختياري يتجاوز عناصر المجموعة طالما قيمة الشرط True ثم يعيد باقي العناصر
' Returns a list of customers. The query ignores all
' customers until the first customer for whom
' IsSubscriber returns false. That customer and all
' remaining customers are returned.
Dim customerList = From cust In customers _
Skip While IsSubscriber(cust)
Take Clause
اختياري ويعيد عددا من العناصر المتجاورة في بداية المجموعة
' Returns the first 10 customers.
Dim customerList = From cust In customers _
Take 10
Take While Clause
اختياري يقوم بتضمين عناصر المجموعة طالما قيمة الشرط True ويتجاهل بقية العناصر
' Returns a list of customers. The query returns
' customers until the first customer for whom
' HasOrders returns false. That customer and all
' remaining customers are ignored.
Dim customersWithOrders = From cust In customers _
Order By cust.Orders.Count Descending _
Take While HasOrders(cust)
كما يمكنك استخدام خصائص إضافية لاستعلام Linq باستدعاء عناصر المجموعات والأنواع المستعلم عنها التي يوفرها Linq حيث يمكنك استخدام هذه الإمكانيات الإضافية باستدعاء معامل استعلام على نتيجة الاستعلام فمثلا الكود التالي يستخدم الطريقة Union لدمج ناتج استعلامين في نتيجة استعلام واحدة ويستخدم الطريقة ToList(TSource) لإعادة ناتج الاستعلام كقائمة
Public Function GetAllCustomers() As List(Of Customer)
Dim customers1 = From cust In domesticCustomers
Dim customers2 = From cust In internationalCustomers
Dim customerList = customers1.Union(customers2)
Return customerList.ToList()
End Function