كتابة أول استعلام LINQ خاص بك (Visual Basic)

الاستعلام هو تعبير يقوم باسترداد بيانات من مصدر بيانات. يتم التعبير عن الاستعلامات بلغة استعلام مخصصة. بمرور الوقت، تم تطوير لغات مختلفة لأنواع مختلفة من مصادر البيانات, على سبيل المثال، SQL لقواعد البيانات العلائقية و XQuery لـ XML. وهذا يجعل من الضروري على مطور التطبيق معرفة لغة استعلام جديد لكل نوع مصدر بيانات أو تنسيق بيانات يدعمه.

مجموعة ميزات Language-Integrated Query‏ (LINQ) تبسط الموقف بعرض نموذج متناسقة للعمل مع بيانات عبر أنواع عديدة من مصادر البيانات و التنسيقات. في استعلام LINQ، أنت دائماً تعمل مع كائنات. تستخدم نفس أنماط الترميز الأساسية لاستعلام و تحويل البيانات في مستندات XML وقواعد البيانات SQL، و مجموعات بيانات ADO.NET وحدات , مجموعات .NET Framework و أي مصدر أو تنسيق أخر يتوفر له موفر LINQ. يصف هذا المستند المراحل الثلاث لإنشاء واستخدام استعلامات LINQ الأساسية.

ارتباط إلى فيديو للحصول على عرض فيديو توضيحي ذي صلة، راجع كيف يمكنني القيام بما يلي: إبدأ مع LINQ ؟.

ثلاث مراحل لتشغيل استعلام

LINQ عمليات الاستعلام تتكون من ثلاثة إجراءات:

  1. للحصول على مصدر البيانات أو مصادر.

  2. إنشاء الاستعلام

  3. تنفيذ الاستعلام

في LINQ، تنفيذ الاستعلام يختلف عن إنشاء الاستعلام. لا تستطيع استرداد أية بيانات فقط بإنشاء استعلام. تتم مناقشة هذه النقطة في تفصيل أكثر لاحقاً في هذا الموضوع.

يوضح المثال التالي أجزاء تشغيل الاستعلام الثلاثة. يستخدم المثال صفيف أعداد صحيحة كمصدر بيانات ملائم لأهداف العرض التوضيحي. ومع ذلك، تطبق نفس المفاهيم أيضًا على مصادر بيانات أخرى.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

إخراج:

0 2 4 6

مصدر البيانات

لأن مصدر البيانات في المثال السابق عبارة عن صفيف, فإنه يدعم ضمنيا واجهة IEnumerable<T> العامة. هذا ما يتيح لك استخدام صفيف كمصدر بيانات لاستعلام LINQ. الأنواع التي تدعم (IEnumerable(Of T أو واجهة مشتقة مثل IQueryable<T> العامة، تسمى أنواع استعلامية.

لأنه نوع استعلامي ضمني, لايتطلب الصفيف تعديل أو معاملة خاصة ليخدم كمصدر بيانات LINQ. ونفس الشيء صحيح بالنسبة لأي نوع مجموعة تدعم (IEnumerable(Of T، بما في ذلك List<T>, Dictionary<TKey, TValue> العامة، و الفئات الأخرى في مكتبة فئات .NET Framework.

إذا كان مصدر البيانات لا يقوم بالفعل بتطبيق (IEnumerable(Of T, يتطلب موفر LINQ لتنفيذ وظيفة مشغلات الاستعلامات القياسية لمصدر البيانات. على سبيل المثال، مكون LINQ to XMLيقوم بأداء عمل تحميل مستند XML إلى نوع XElement استعلامي, كما هو موضح في المثال التالي. لمزيد من المعلومات حول عوامل استعلام قياسية، راجع نظرة عامة على مشغلات استعلام قياسية.

' Create a data source from an XML document.
Dim contacts = XElement.Load("c:\myContactList.xml")

مع مكون LINQ to SQL، يجب أولاً إنشاء تعيين كائن علائقي في وقت التصميم, إما يدوياً أو باستخدام Object Relational Designer (O/R Designer). تقوم بكتابة الاستعلامات الخاصة بك مقابل الكائنات, وفي وقت التشغيل مكون LINQ to SQL يعالج الاتصالات مع قاعدة البيانات. في المثال التالي, يمثل customers جدول معين في قاعدة البيانات، و Table<TEntity> يدعم IQueryable<T> العامة.

' Create a data source from a SQL table.
Dim db As New DataContext("C:\Northwind\Northwnd.mdf")
Dim customers As Table(Of Customer) = db.GetTable(Of Customer)

لمزيد من المعلومات حول كيفية إنشاء أنواع معينة من مصادر بيانات, راجع وثائق موفرات LINQ المتنوعة. للحصول على قائمة من الموفرات تلك ، راجع مجموعة ميزات Language-Integrated Query (LINQ). القاعدة الأساسية بسيطة: مصدر بيانات LINQ هو أي كائن يدعم واجهة IEnumerable<T> العامة أو واجهة ترث منها.

ملاحظة

أنواع مثل ArrayList التي تدعم واجهة IEnumerable الغير عامة يمكن أيضاً استخدامها كمصدر بيانات LINQ. لمثال يستخدم ArrayList، راجع كيفية القيام بما يلي: استعلام ArrayList مع LINQ.

الاستعلام

في الاستعلام ، تقوم بتحديد ما هي المعلومات التي تريد استردادها من مصدر البيانات أو المصادر. لديك أيضاً خيار تحديد كيفية فرز هذه المعلومات, تجميعها أو بنائها قبل إرجاعها. لتمكين إنشاء استعلام, ادمج Visual Basic بناء جملة استعلام جديد في اللغة.

عندما يتم تنفيذه، الاستعلام في المثال التالي يقوم بإرجاع كل الأرقام الزوجية من صفيف أعداد صحيحة numbers.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

يحتوي تعبير الاستعلام على ثلاثة بنود: From ، Where و Select الوظيفة المعينة والغرض من كل جملة تعبير استعلام تمت مناقشتها في عمليات الاستعلام الأساسية (Visual Basic). لمزيد من المعلومات، راجع استعلامات (Visual Basic). لاحظ أن في LINQ، تعريف الاستعلام غالباً يتم تخزينه في متغير ويتم تنفيذه لاحقاً. متغير الاستعلام, مثل evensQuery في المثال السابق، يجب أن يكون من نوع استعلامي. نوع evensQuery هو IEnumerable(Of Integer)، يتم تعيينه من قبل برنامج التحويل البرمجي باستخدام استدلال النوع المحلي.

من المهم تذكر أن متغير الاستعلام نفسه لا يقوم بأي إجراء و لا يرجع أية بيانات. هو فقط يخزن تعريف الاستعلام. في المثال السابق، التكرار الحلقي For Each هو ما ينفذ الاستعلام.

تنفيذ الاستعلام

تنفيذ الاستعلام منفصل عن تعريف الاستعلام. إنشاء الاستعلام يقوم بتعريف الاستعلام، لكن يتم تشغيل التنفيذ بواسطة آلية مختلفة. يمكن تنفيذ الاستعلام كما هو معرف (للتنفيذ الفوري) ، أو يمكن تخزينها في التعريف ويمكن الاستعلام وتنفيذه لاحقا (تنفيذ المؤجلة).

تنفيذ مؤجل

استعلام LINQ نموذجي يشبه الموجود في المثال السابق الذي يعرف evensQuery. يقوم بإنشاء استعلام لكنه لا بقوم بتنفيذه مباشرةً. بدلاً من ذلك، يتم تخزين تعريف الاستعلام في متغير الاستعلام evensQuery. تقوم بتنفيذ الاستعلام لاحقاً، عادةً باستخدام تكرار حلقي For Each الذي يقوم بإرجاع تسلسل من القيم، أو بواسطة تطبيق مشغل الاستعلامات القياسي ، مثل Count أو Max. ويشار إلى هذه العملية باسم التنفيذ المؤجل.

' Query execution that results in a sequence of values.
For Each number In evensQuery
    Console.Write(number & " ")
Next

' Query execution that results in a single value.
Dim evens = evensQuery.Count()

لتسلسل من القيم, تقوم بالوصول إلى البيانات المستردة باستخدام متغير التكرار في التكرار الحلقي For Each (number في المثال السابق). لأن متغير الاستعلام evensQuery، يحتفظ بتعريف الاستعلام بدلاً من نتائج الاستعلام, يمكنك تنفيذ استعلام بقدر ما تشاء باستخدام متغير الاستعلام أكثر من مرة. على سبيل المثال، قد يكون لديك قاعدة بيانات في التطبيق الخاص بك يتم تحديثها باستمرار من قبل تطبيق منفصل. بعد إنشاء استعلام يقوم باسترداد بيانات من قاعدة بيانات تلك، يمكنك استخدام تكرار حلقي For Each لتنفيذ الاستعلام بشكل متكرر, و استرداد أحدث البيانات كل مرة.

يوضح المثال التالي كيفية عمل التنفيذ المؤجل. بعد تعريف و تنفيذ evensQuery2 بواسطة تكرار حلقي For Each، كما في الأمثلة السابقة, بعض العناصر في مصدر البيانات numbers تتغير. ثم تكرار حلقي For Each ثاني يشغل evensQuery2 مرة أخرى. النتائج تختلف في المرة الثانية، لأن التكرار الحلقي For Each ينفذ الاستعلام مرة أخرى، باستخدام قيم جديده في numbers.

Dim numberArray() = {0, 1, 2, 3, 4, 5, 6}

Dim evensQuery2 = From num In numberArray
                  Where num Mod 2 = 0
                  Select num

Console.WriteLine("Evens in original array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

' Change a few array elements.
numberArray(1) = 10
numberArray(4) = 22
numberArray(6) = 8

' Run the same query again.
Console.WriteLine(vbCrLf & "Evens in changed array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

إخراج:

Evens in original array:

0 2 4 6

Evens in changed array:

0 10 2 22 8

تنفيذ فوري

في التنفيذ المؤجل للاستعلامات، تعريف الاستعلام يتم تخزينه في متغير استعلام لتنفيذه لاحقاً. في التنفيذ الفوري، الاستعلام ينفذ في وقت التعريف الخاص به. يتم تشغيل التنفيذ عندما تطبق أسلوب يتطلب الوصول إلى عناصر فردية من نتيجة الاستعلام. يفرض التنفيذ الفوري غالباً باستخدام أحد مشغلات الاستعلامات القياسية التي تقوم بإرجاع قيماً مفردة. أمثلة هي Count, Max, Average، و First. مشغلات الاستعلامات القياسية هذه تنفذ الاستعلام بمجرد تطبيقها لكي تتمكن من حساب وإرجاع نتيجة مفردة. للحصول على معلومات أكثر حول مشغلات الاستعلامات القاسية التي تقوم بإرجاع قيم مفردة، راجع عمليات تجميع LINQ, عمليات العنصر، و عمليات محدد الكمية.

الاستعلام التالي يقوم بإرجاع عدد الأرقام الزوجية في صفيف أعداد صحيحة. تعريف الاستعلام لا يتم حفظه، و numEvens هو Integer بسيط.

Dim numEvens = (From num In numbers
                Where num Mod 2 = 0
                Select num).Count()

يمكنك تحقيق نفس النتيجة عن طريق استخدام الأسلوب Aggregate.

Dim numEvensAgg = Aggregate num In numbers
                  Where num Mod 2 = 0
                  Select num
                  Into Count()

يمكنك أيضاً فرض تنفيذ استعلام عن طريق استدعاء الأسلوب ToList أو ToArray على استعلام (فوري) أو متغير استعلام (مؤجل) ، كما هو موضح في التعليمات البرمجية التالية.

' Immediate execution.
Dim evensList = (From num In numbers
                 Where num Mod 2 = 0
                 Select num).ToList()

' Deferred execution.
Dim evensQuery3 = From num In numbers
                  Where num Mod 2 = 0
                  Select num
' . . .
Dim evensArray = evensQuery.ToArray()

في الأمثلة السابقة، evensQuery3 هو متغير الاستعلام, ولكن evensList عبارة عن قائمة و evensArray عبارة عن صفيف.

استخدام ToList أو ToArray لفرض التنفيذ الفوري مفيد بشكل خاص في السيناريوهات التي تريد بها تنفيذ استعلام مباشرةً و تخزين النتائج في كائن مجموعة واحدة. لمزيد من المعلومات حول هذه القياسات , راجع تحويل أنواع بيانات.

يمكنك أيضاً أن تتسبب بتنفيذ استعلام باستخدام أسلوب IEnumerable مثل أسلوب IEnumerable.GetEnumerator.

عروض فيديو ذات الصلة

راجع أيضًا:

المهام

نماذج LINQ

المبادئ

O/R Designer Overview

للاستخراج نوع المحلي

نظرة عامة على مشغلات استعلام قياسية

مقدمة حول LINQ في Visual Basic

موارد أخرى

الشروع في العمل مع LINQ في Visual Basic

LINQ في Visual Basic

استعلامات (Visual Basic)