علاقات النوع في عمليات استعلام (Visual Basic)
المتغيرات المستخدمة في عمليات استعلام مجموعة ميزات Language-Integrated Query (LINQ) هي محددة النوع بدقة و يجب أن تكون متوافقة مع بعضها البعض. يستخدم تحديد النوع بدقة في مصدر البيانات، في الاستعلام نفسه، و في تنفيذ الاستعلام. يحدد الرسم التوضيحي التالي المصطلحات المستخدَمة في وصف استعلام LINQ. لمزيد من المعلومات حول أجزاء استعلام، راجع عمليات الاستعلام الأساسية (Visual Basic).
أجزاء استعلام LINQ
يجب أن يكون نوع متغير النطاق في الاستعلام متوافق مع نوع العناصر الموجودة في مصدر البيانات. يجب أن يكون نوع متغير النطاق في الاستعلام متوافق مع تسلسل العنصر المعرف في البند Select . أخيراً، نوع عناصر التسلسل يجب أن يكون أيضاً متوافق مع نوع متغير عنصر تحكم التكرار الحلقي المعرف في العبارة For Each التي تنفذ الاستعلام: يسهّل تحديد النوع بدقة تحديد نوع الأخطاء في وقت الترجمة.
يجعل Visual Basic تحديد النوع بدقة ملائم عن طريق تطبيق استنتاج النوع المحلي, والتي تعرف أيضاً باسم كتابة ضمنية. تم استخدام هذه الميزة في المثال السابق، كما ستراها مستخدمة خلال نماذج و وثائق LINQ. في Visual Basic، يتم إنجاز استدلال النوع المحلي ببساطة عن طريق استخدام عبارة Dim بدون بند As. في المثال التالي، تم تحديد نوع city بدقة كسلسلة.
Dim city = "Seattle"
ملاحظة
يعمل نوع الاستدلال المحلي فقط عندما يتم تعيين Option Infer إلى On. لمزيد من المعلومات، راجع الخيار الاستدلال كشف حساب.
ومع ذلك، حتى في حالة استخدام استدلال النوع المحلي في استعلام، نفس علاقة النوع يتم عرضها بين المتغيرات في مصدر البيانات، متغير الاستعلام و التكرار الحلقي لتنفيذ الاستعلام. من المفيد أن يكون هناك فهم أساسي لعلاقات النوع عند كتابة استعلامات LINQ، أو العمل مع النماذج و أمثلة التعليمات البرمجية في الوثائق.
قد تحتاج لتحديد نوع صريح لمتغير نطاق لا يتطابق مع النوع الذي يتم إرجاعه من مصدر البيانات. يمكنك تحديد نوع متغير النطاق باستخدام البند As. ومع ذلك، ينتج عن هذا خطأ إذا كان التحويل تحويل تضييقي و تعيين Option Strict إلى On. ولذلك، نوصي بتنفيذ التحويل على القيم التي تم استردادها من مصدر البيانات. يمكنك تحويل القيم من مصدر البيانات إلى نوع متغير النطاق الصريح باستخدام الأسلوب Cast<TResult>. يمكنك أيضاً تغيير القيم المحددة في بند Select إلى نوع صريح مختلف عن نوع متغير النطاق. يتم توضيح هذه النقاط في التعليمات البرمجية التالية.
Dim numbers1() As Integer = {1, 2, 4, 16, 32, 64}
Dim numbers2() As Double = {5.0#, 10.0#, 15.0#}
' This code does not result in an error.
Dim numberQuery1 = From n As Integer In numbers1 Where n > 5
' This code results in an error with Option Strict set to On. The type Double
' cannot be implicitly cast as type Integer.
Dim numberQuery2 = From n As Integer In numbers2 Where n > 5
' This code casts the values in the data source to type Integer. The type of
' the range variable is Integer.
Dim numberQuery3 = From n In numbers2.Cast(Of Integer)() Where n > 5
' This code returns the value of the range variable converted to Integer. The type of
' the range variable is Double.
Dim numberQuery4 = From n In numbers2 Where n > 5 Select CInt(n)
الاستعلامات التي ترجع عناصر كاملة من مصدر البيانات
يظهر المثال التالي عمليات استعلام LINQ التي ترجع تسلسل من عناصر محددة من مصدر البيانات. المصدر، names، يتضمن صفيف سلاسل، و مخرجات الاستعلام هي تسلسل يحتوي على سلاسل تبدأ مع الحرف M.
Dim names = {"John", "Rick", "Maggie", "Mary"}
Dim mNames = From name In names
Where name.IndexOf("M") = 0
Select name
For Each nm In mNames
Console.WriteLine(nm)
Next
هذا مكافئ للتعليمات البرمجية التالية, ولكنه أقصر وأسهل للكتابة بكثير. الإعتماد على استدلال النوع المحلي في الاستعلامات هو النمط المفضل في Visual Basic.
Dim names2 = {"John", "Rick", "Maggie", "Mary"}
Dim mNames2 As IEnumerable(Of String) =
From name As String In names
Where name.IndexOf("M") = 0
Select name
For Each nm As String In mNames
Console.WriteLine(nm)
Next
العلاقات التالية توجد في كلا من أمثلة التعليمات البرمجية التالية، سواء كانت الأنواع قد تحددت ضمنيا أو بشكل صريح.
نوع العناصر في مصدر البيانات names، هو نوع متغير النطاق name، في الاستعلام.
نوع الكائن المحدد, name، يحدد نوع متغير الاستعلام mNames. هناname هو سلسلة، لذلك متغير الاستعلام هو IEnumerable (من سلسلة) في Visual Basic.
الاستعلام المعرف في mNames تم تنفيذه في التكرار الحلقي For Each. يتكرر التكرار الحلقي عبر نتيجة تنفيذ الاستعلام. لأنه عند تنفيذ mNames، سيرجع تسلسل من سلاسل ، متغير تكرار التكرار الحلقي nm، هو سلسلة أيضاً.
الاستعلامات التي ترجع حقل واحد من عناصر محددة.
يظهر المثال التالي عملية استعلام مكون LINQ to SQL التي تقوم بإرجاع تسلسل يحتوي على جزء واحد فقط من كل عنصر محدد من مصدر البيانات. يأخذ الاستعلام مجموعة من كائنات Customer كالمصدر لبياناته و يطلق فقط الخاصية Name في الناتج. لأن اسم العميل هو سلسلة، ينتج الاستعلام تسلسل من سلاسل كمخرجات.
' Method GetTable returns a table of Customer objects.
Dim customers = db.GetTable(Of Customer)()
Dim custNames = From cust In customers
Where cust.City = "London"
Select cust.Name
For Each custName In custNames
Console.WriteLine(custName)
Next
العلاقات بين المتغيرات مثل تلك الموجودة في المثال الأسهل.
نوع العناصر في مصدر البيانات customers، هو نوع متغير النطاق cust، في الاستعلام. في هذا المثال، ذلك النوع هو Customer.
العبارة Select تقوم بإرجاع الخاصية Name لكل كائن Customer بدلاً من الكائن ككل. لأن Name هو سلسلة، متغيّر الاستعلام custNames، سيكون مرة أخرى IEnumerable (من سلسلة)، ليست Customer.
لأن custNames يمثل تسلسل من سلاسل، متغير التكرار الحلقي For Each , custName، يجب أن يكون سلسلة.
بدون استدلال النوع المحلي، المثال السابق ستكون مرهق أكثر في كتابته و فهمه، كما هو موضح في المثال التالي.
' Method GetTable returns a table of Customer objects.
Dim customers As Table(Of Customer) = db.GetTable(Of Customer)()
Dim custNames As IEnumerable(Of String) =
From cust As Customer In customers
Where cust.City = "London"
Select cust.Name
For Each custName As String In custNames
Console.WriteLine(custName)
Next
الاستعلامات التي تتطلب أنواع مجهولة
يوضح المثال التالي موقف أكثر تعقيداً. في المثال السابق، لقد كان من غير الملائم تحديد أنواع لكافة المتغيرات بشكل صريح. في هذا المثال، فهو من المستحيل. بدلاً من تحديد كامل عناصر Customer من مصدر البيانات، أو حقل واحد من كل عنصر، البند Select في هذا الاستعلام يرجع خاصيتين الكائن الأصلي Customer: Name وCity استجابة إلى بند Select، يقوم المحول البرمجي بتعريف نوع مجهول يحتوي على تلك الخاصيتين. نتيجة تنفيذ nameCityQuery في التكرار الحلقي For Each هي مجموعة من مثيلات للنوع المجهول الجديد. لأن النوع المجهول ليس له اسم قابل للاستخدام, لا يمكنك تحديد نوع nameCityQuery أو custInfo بشكل صريح. وهذا يعني، مع النوع المجهول، ليس لديك اسم نوع لاستخدامه بدلاً من String في IEnumerable(Of String). لمزيد من المعلومات، راجع أنواع مجهول.
' Method GetTable returns a table of Customer objects.
Dim customers = db.GetTable(Of Customer)()
Dim nameCityQuery = From cust In customers
Where cust.City = "London"
Select cust.Name, cust.City
For Each custInfo In nameCityQuery
Console.WriteLine(custInfo.Name)
Next
على الرغم من أنه من غير الممكن تحديد أنواع لكل المتغيرات في المثال السابق، العلاقات تبقى نفسها.
نوع العناصر في مصدر البيانات ، هو مرة أخرى نوع متغير النطاق ، في الاستعلام. في هذا المثال، cust هو مثيل إلى Customer.
لأن العبارة Select تنتج نوع مجهول، متغير الاستعلام nameCityQuery، يجب أن يكون نوعه محدد ضمنيا كنوع مجهول. ليس للنوع المجهول اسم قابل للاستخدام، لذلك لايمكن أن يحدد بشكل صريح.
نوع متغير التكرار في التكرار الحلقي For Each هو النوع المجهول الذي تم إنشائه في الخطوة 2. لأن النوع المجهول ليس له اسم قابل للاستخدام, يجب أن يحدد نوع متغير التكرار الحلقي ضمنيًا.
راجع أيضًا:
المبادئ
مقدمة حول LINQ في Visual Basic