مشاريع
أقسام المقالات
Total Articles: 19
مؤتمرات وأحداث
مراكز وانجازات
.net 2008 Course
آخر 10 مواضيع
كتب وملخصات
Tips & Tricks
مقدمة إلى Linq في فيجول بايزيك
الخميس، ٢٢ مايو ٢٠٠٨

            تضيف Linq إمكانيات استعلامية لفيجول بايزيك وتقدم إمكانيات بسيطة وقوية عندما تتعامل مع العديد من أنواع البيانات إضافة إلى إرسال الاستعلام إلى قاعدة بيانات كي تتم معالجته أو العمل مع صيغة مختلفة للاستعلام لكل نوع من أنواع البيانات التي تقوم بالبحث عنها. حيث تقدم Linq الاستعلامات كجزء من لغة فيجول بايزيك مستخدمة صيغة موحدة بغض النظر عن نوع البيانات الذي تستخدمه. كما أنها تمكنك من الاستعلام عن البيانات من قاعدة بيانات SQL Server أو Xml أو المجموعات والمصفوفات في الذاكرة أو ADO .net Datasets أو أي مصدر بيانات محلي أو بعيد يدعم Linq حيث يمكنك عمل ذلك كله باستخدام عناصر لغة فيجول بايزيك الشائعة لأن استعلاماتك أصبحت مكتوبة بلغة فيجول بايزيك ونتائج الاستعلام تعاد كأغراض أنواع بيانات قوية داعمة IntelliSense مما يجعل كتابتك للكود أسرع واكتشافك للأخطاء في الاستعلامات عند ترجمة المشروع بدلا من وقت التنفيذ كما أن استعلامات Linq يمكن أن تكون مصدرا لاستعلامات إضافية لمزيد من الدقة في البحث. كما يمكن ربطها مع التحكمات ممكنا المستخدم من استعراض وتعديل نتائج استعلامك بسهولة. فمثلا يظهر الكود التالي استعلام Linq يعيد قائمة Customers من مجموعة ويقوم بتجميعهم حسب الموقع



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


 

تم التحرير بواسطة samerselo @ ٩:٠٤ م  
1 Comments:
  • At ١ مارس ٢٠٠٩ في ٦:٣١ ص, Anonymous غير معرف said…

    السلام عليكم
    أريد كود لجمع هذا الوقت
    01:50:15:10
    +
    00:10:10:20
    ـــــــــــــــــــــــــــــــــــ
    02:00:26:05

    وكما تلاحظون أنني أريد تقسيم الثانية ألى 25 جزء

    وشكرا لكم على تعاونكم
    viotarcell@hotmail.com

     
إرسال تعليق
<< Home
 
الصفحة الرئيسية
Google Search
Google
       

كتاب المدونة
من نحن ؟
مجموعة من الكتاب باللغة العربية بلغة الدوت نت ، نلتقي هنا لكي نتشارك الخبرات والمعلومات حول الجديد في عالم الدوت نت
ارشيف المواضيغ والمقالات السابقة
VB.net <> C#

الفروقات بين سي شارب و في بي . نت
روابط ومواقع تقنية عربية
عداد الزيارات
Locations of visitors to this page
أشخاص شرفونا بزيارتهم
مركز التحميل
© 2005 DotNet4Arab Blogspot Template by Isnaini Dot Com