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

 

في عرف المتغيرات التقليدية تعد القيمة Null غير مقبولة اطلاقاً ، فالمتغير من نوع Boolean مثلاً لا بد ان يحتوي على True أو False ، المتغير Short لا بد ان يحتوي على ارقام ما بين الصفر و 32767 مثلاً ... وهكذا ، في حين كانت القيم النصية مثلاً String تستطيع استيعاب القيمة null لإنها من نوع reference .

لكننا في بعض الاحيان نضطر لأن يحمل متغير منطقي Boolean قيمة (لا قيمة - Null ) بمعنى اننا غير قادرين على تحديد فيما إذا كان True أو False ، ابسط امثلة ذلك هي المشكلة التقليدية التي تواجه اغلب مبرمجي قواعد البيانات في حالة عدم ادخال المستخدم لقيمة في حقل ما وليكن حقل (متزوج) ، ولنفرض ان المستخدم لم يحدد كون الشخص متزوجاً من عدمه ، في هذه الحالة سيظل الحقل يحتفظ بقيمة null ، وهو ما كان يستلزم عمل Check على انها ليست Null قبل وضعها في اي متغير من نوع bool مثلاً .

لكن ومع الاصدارة الثانية من .net framework اصبح بالامكان تعريف متغير مخصص ليسمح بتقبل القيمة null اضافة للقيم الاساسية له ، كما في المثال التالي :

bool? ismarried = null;

 

في هذه الحالة يمكننا اسناده لقراءة قيمة مباشرة من قاعدة البيانات دون القلق من كون القيمة الحالية هي Null .

 

هناك عدة طرق اخرى لتعريف متغير يقبل Null مثل الطريقة التالية ايضا :

Nullable<bool> nullableBool = null;

 

حيث ان ? هي فعلياً اختصار لل generic المسمى System.Nullable<T> ، وهو ما سنتعرف على معناه في مراحل قادمة من الدورة .

وبنفس الطريقة فيما لو اردنا تعريف دالة يكون ال return لها Nullable فسيكون ذلك بالشكل التالي :

public bool? functionName()

 

خصائص ال Nullable :

اهم خصائص ال nullable هي خاصية HasValue والتي تحدد فيما إذا كان المتغير به قيمة ام انه يحتفظ بقيمة Null بالشكل التالي :

if (ismarried.HasValue)

 

يمكن كتابتها باستخدام وسائل المقارنة ايضاً != أو <> في الفيجوال بيسك بالشكل التالي :

C#:

if (ismarried!=null)

 

VB.net:

if ismarried<>nothing then



*** حيث ان nothing خاصة بالفيجوال بيسك بدلاً من null في السي شارب .

المعامل ؟؟ :

يمكن استخدام المعامل ؟؟ مع القيم ال nullable لكي نخبره بوضع قيمة ما في حالة وجودها ب null ، لنفترض مثال حالة الزواج السابق ، وسنفترض ان اي شخص لم يقم بادخال بيانات الزواج فهو شخص اعزب بمعنى ان القيمة ستصبح False مباشرة ، سنقوم بكتابة الكود التالي من اجل ذلك :

int? ismarried = returnvaluefromdatabase() ?? False;

 

التسميات: ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ١١:٥٣ م   1 تعقيبات
Strategy Design Pattern
الجمعة، ٣٠ مايو ٢٠٠٨

The Strategy Design Pattern
نبدأ أولاً مع التعريف وهو :

The Strategy Design Pattern basically consists of decoupling an algorithm from its host, and encapsulating the algorithm into a separate class. More simply put, an object and its behaviour are separated and put into two different classes. This allows you to switch the algorithm that you are using at any time.

وباختصار ، فإن هذا الباترن مكون من عملية decoupling للالجوريزم و encapsulating في كلاسات Classes مختلفة ، حيث يتم فصل الكائن عن سلوكه في كلاسين منفصلين ، وهو ما سيسمح لك لاحقاً بتغيير الالجوريزم وقت ما تريد .

مميزات هذا الباترن :
- يمكنك بكل بساطة من خلاله تغيير ال behaviour الخاص بك وقت ما تريد عن طريق فصل كل behaviour في كلاس خاص به .
- في حالة رغبتك في اضافة behaviour أو تعديله لن تضطر إلى التعديل في الكلاس الرئيسي .


الاستخدام :
عندما يكون لديك عدد من الكائنات Objects متشابه ومختلفة فقط في ال behaviour فإنه من المفضل دائماً استخدام Strategy حيث يمكنك اختصار جميع هذه الكلاسات في كلاس واحد فقط مع استخدام Strategies مختلفة .
كذلك الأمر أيضاً مع subclassing للكائنات ، حيث يعتمد الحل القديم على كون ال behaviour من نوع static ، وعندما ترغب في تغييره فإنك تقوم بعمل new instance ومن ثم تقوم بعمل تبديل replace للقديم ، ولكن الآن كل ما عليك هو تغيير ال Strategy وهو سيقوم تلقائياً بتعديل ال behaviour .


أيضاً فإن وجود عدد كبير من ال behaviour في كلاس واحد سيجبرك على كثرة استخدام الجمل الشرطية لمعرفة ال behaviour المطلوب ، أما مع Strategy فلن تحتاج إلى ذلك أبداً .
طريقة العمل بكل بساطة في الصورة التالية :

والله الموفق ..
والسلام عليكم ورحمة الله وبركاته .

التسميات:


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ٣:٤٤ م   1 تعقيبات
تشفير الأسرار للمستخدم الحالي
الاثنين، ٢٦ مايو ٢٠٠٨


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



 


و الحل المثالي هو جعل نظام الويندوز يقوم بتشفير البيانات من أجلك ولتحقيق هذا ستحتاج إلى ما يسمى بـ DPAPI أو Data Protection API والذي يقوم بتشفير البيانات باستخدام مفتاح متماثل مبني على معلومات خاصة بالمستخدم والآلة وبهذه الطريقة لم تعد تقلق بخصوص تخزين المفتاح ووثوقيته وبدلا عن ذلك يتأكد نظام التشغيل من وثوقية المستخدم عندما يدخل إلى النظام وتكون البيانات المخزنة من قبل مستخدم غير ممكنة الوصول بالنسبة للمستخدمين الآخرين.


في النسخ السابقة من الدوت نيت لايوجد فئات مدارة لاستخدام DPAPI وتم تصحيح هذا في الدوت نيت 2.0 بالفئة الجديدة ProtectData في مجال الأسماء System.Security.Cryptography


 


كيف يمكنني فعل ذلك


 


            الفئة ProtectData تقدم طريقتان مشتركتان Shared Methods الأولى ProtectData تأخذ مصفوفة بايتات تمثل البيانات المراد تشفيرها وتعيد مصفوفة بايتات بالبيانات المشفرة والثانية UnprotectData تقوم بالعملية المعاكسة حيث تأخذ مصفوفة بايتات بالبيانات المشفرة وتعيد مصفوفة بايتات بالبيانات المفكوك تشفيرها. وباستخدام ProtectData و UnprotectData يمكنك فقط التعامل مع مصفوفات بايتات Byte Array وهذا يعني أنك عندما تريد تشفير بيانات من أي نوع عليك القيام بتحويلها إلى مصفوفة بايتات قبل القيام بالتشفير.


 


مثال عملي


 


Imports System.Security.Cryptography


Imports System.IO


 


Module ProtectData


 


    Sub Main()


 


        ' Get the data.


        Console.WriteLine("Enter a secret message and press enter.")


        Console.Write(">")


        Dim Input As String = Console.ReadLine()


        Console.WriteLine()


 


        If Input <> "" Then


            Dim Data(), EncodedData() As Byte


 


            ' Write the data to a new MemoryStream.


            Dim DataStream As New MemoryStream()


            Dim Writer As New StreamWriter(DataStream)


            Writer.Write(Input)


            Writer.Close()


 


            ' Convert the MemoryStream into a byte array,


            ' which is what you need to use the ProtectData() method.


            Data = DataStream.ToArray()


 


            ' Encrypt the byte array.


            EncodedData = ProtectedData.Protect(Data, Nothing, _


              DataProtectionScope.CurrentUser)


 


            ' Store the encrypted data in a file.


            My.Computer.FileSystem.WriteAllBytes("c:\secret.bin", _


        EncodedData, False)


 


        End If


    End Sub


 


End Module


 


عندما تقوم بتشغيل التطبيق سيطلب من إدخال نص والذي سيقوم بتشفيره باستخدام الحساب الحالي للمستخدم ويقوم بتخزين البيانات في الملف secret.bin والبيانات الموجودة فيه لن يستطيع قراءتها أي مستخدم آخر. وللتأكد من أن البيانات مشفرة فعلا لديك خياران قم بفتح الملف وألقي نظرة بنفسك أو يمكنك تعديل الكود ليقرأ البيانات مباشرة من مجرى الذاكرة Memory Stream و الكود التالي يحاول القيام بالخيار الثاني ونتيجة إظهاره ستتكون سلسة نصية لا معنى لها


 


  ' Verify the data is encrypted by reading and displaying it


  ' without performing any decryption.


  DataStream = New MemoryStream(EncodedData)


  Dim Reader As New StreamReader(DataStream)


  Console.WriteLine("Encrypted data: " & Reader.ReadToEnd())


  Reader.Close()


 


            ولتفكيك تشفير البيانات يجب عليك وضعها في مصفوفة بايتات ثم استخدام الطريقة UnprotectData لاستخلاص البيانات من مصفوفة البايتات ويمكنك إضافة StreamReader لإضافة دعم لتفكيك التشفير للمثال السابق مثلا يمكنك إضافة الكود التالي ليقرأ البيانات من الملف ويظهر الجملة التي أدخلتها سابقا


 


If My.Computer.FileSystem.FileExists("c:\secret.bin") Then


            Dim Data(), EncodedData() As Byte


 


            EncodedData = My.Computer.FileSystem.ReadAllBytes("c:\secret.bin")


            Data = ProtectedData.Unprotect(EncodedData, Nothing, _


              DataProtectionScope.CurrentUser)


 


            Dim DataStream As New MemoryStream(Data)


            Dim Reader As New StreamReader(DataStream)


 


            Console.WriteLine("Decoded data from file: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


تذكر بما أن البيانات تم تشفيرها بواسطة حساب المستخدم الحالي يمكنك تفكيك تشفيرها في أي وقت والقيد الوحيد هو انك يجب أن تدخل باستخدام نفس حساب المستخدم ولاحظ أنك عندما تقوم بحماية البيانات يجب عليك اختيار واحدة من القيم من التعداد DataProtectionScope Enumeration ويكون بذلك لديك خياران:


 


LocalMachine


سيقوم ويندوز بتشفير البيانات بمفتاح خاص بالآلة وبهذا تضمن أن لا أحد يستطيع قراءة البيانات إلا على نفس الجهاز. وهذا يعمل جيدا بالنسبة للتطبيقات التي تعمل على المخدم Server Side Application والتي تعمل بدون تدخل المستخدم


 


            CurrentUser


                        سيقوم ويندوز بتشفير البيانات بمفتاح خاص بالمستخدم وبالتالي لا يمكن قراءتها من قبل المستخدمين الآخرين


 


            في المثال المذكور يتم تخزين بيانات خاصة بالمستخدم ومع ذلك يمكنك تغيير مجال حماية البيانات DataProtectionScope ليتم تخزين البيانات بشكل يستطيع جميع مستخدمي الجهاز الوصول إليها.



 


وفيما يلي سرد للمثال كاملا وهو تطبيق من نوع Console Application


 


 


Imports System.Security.Cryptography


Imports System.IO


 


Module ProtectData


    Sub Main()


 


        ' Get the data.


        Console.WriteLine("Enter a secret message and press enter.")


        Console.Write(">")


        Dim Input As String = Console.ReadLine()


        Console.WriteLine()


 


        If Input <> "" Then


            Dim Data(), EncodedData() As Byte


 


            ' Write the data to a new MemoryStream.


            Dim DataStream As New MemoryStream()


            Dim Writer As New StreamWriter(DataStream)


            Writer.Write(Input)


            Writer.Close()


 


            ' Convert the MemoryStream into a byte array,


            ' which is what you need to use the ProtectData() method.


            Data = DataStream.ToArray()


 


            ' Encrypt the byte array.


            EncodedData = ProtectedData.Protect(Data, Nothing, _


              DataProtectionScope.CurrentUser)


 


            ' Store the encrypted data in a file.


            My.Computer.FileSystem.WriteAllBytes("c:\secret.bin", _


               EncodedData, False)


 


            ' Verify the data is encrypted by reading and displaying it


            ' without performing any decryption.


            DataStream = New MemoryStream(EncodedData)


            Dim Reader As New StreamReader(DataStream)


            Console.WriteLine("Encrypted data: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


        If My.Computer.FileSystem.FileExists("c:\secret.bin") Then


            Dim Data(), EncodedData() As Byte


 


            EncodedData = My.Computer.FileSystem.ReadAllBytes("c:\secret.bin")


            Data = ProtectedData.Unprotect(EncodedData, Nothing, _


              DataProtectionScope.CurrentUser)


 


            Dim DataStream As New MemoryStream(Data)


            Dim Reader As New StreamReader(DataStream)


 


            Console.WriteLine("Decoded data from file: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


        Console.ReadLine()


    End Sub


 


End Module


ماذا عن ...


            حماية البيانات قبل تخزينها في قاعدة البيانات؟ طالما أنك استخدمت الفئة ProtectedData لتشفير بياناتك يمكنك وضعها في أي مكان تريده ففي المثال السابق قمت بكتابة البيانات المشفرة إلى ملف ومع ذلك يمكنك كتابة البيانات الثنائية إلى سجل قاعدة البيانات ولفعل ذلك ستحتاج ببساطة إلى حقل ثنائي binary في جدولك بمساحة كافية ليتسع لمصفوفة البايتات المشفرة وفي الـ Sql Server تستخدم نوع البيانات varbinary لهذا الغرض


 


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة samerselo @ ١٠:٤٧ م   0 تعقيبات
كيف تقوم بإضافة إجراءاتك الخاصة إلى مجال الأسماء My
الخميس، ٢٢ مايو ٢٠٠٨

لإضافة فئة جديدة إلى مجال الأسماء My كل ما عليك عمله هو إضافة كتلة Namespace  تحمل اسم My فإذا أردنا إضافة فئة جديدة إلى مجال الأسماء My مثلا TestClass يحتوي على دالة JustForTest سنقوم ببساطة بكتابة الكود التالي


 


Namespace My


 


    Public Class TestClass


 


        Public Shared Function JustForTest(ByVal SomeText As String) As String


            Return SomeText & ", " & Now.ToString("dddd")


        End Function


 


    End Class


 


End Namespace


 


و أصبح الآن بإمكاننا استخدامه كبقية الفئات الموجودة سابقا في مجال الأسماء My



 


        TextBox2.Text = My.TestClass.JustForTest(TextBox1.Text(


 


ولكن تجدر الملاحظة هنا أن الدالات التي ستستخدمها هنا يجب أن تكون Shared أو أن تقوم بتضمينها في Module بدلا من Class وذلك لأن جميع الدالات والخصائص الموجود في Module تكون Shared دائما.


 


كما يمكنك اعتماد على الميزة الجديدة وهي الفئات الجزئية Partial Class أيضا إضافة عناصر أخرى لبعض فئات مجال الأسماء My مثل الفئة My.Computer أو الفئة My.Application ولفعل ذلك نقوم بإنشاء فئة جزئية بالاسم الصحيح وإضافة العناصر الجديدة التي نريد حيث يجب عليك تعريف هذه الفئة باستخدام Friend حتى تتطابق مع الفئة الأصلية الموجودة سابقا


Namespace My


 


    ' Extend My.Application Class


    Partial Friend Class MyApplication


 


        Public Function AppTest() As String


            Return "For Test Purposes"


        End Function


 


    End Class


 


 


End Namespace


 


واستخدامه أيضا كبقية الفئات الموجودة سابقا


 


        TextBox3.Text = My.Application.AppTest


 


وبهذا يصبح الكود الكامل لمثالنا هنا كالتالي


Public Class Form1


 


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles



Button1.Click


        TextBox2.Text = My.TestClass.JustForTest(TextBox1.Text(


        TextBox3.Text = My.Application.AppTest


    End Sub


 


End Class


 


Namespace My


 


    ' Add New Class


    Public Class TestClass


 


        Public Shared Function JustForTest(ByVal SomeText As String) As String


            Return SomeText & ",   " & Now.ToString("dddd dd/MM/yyyy")


        End Function


 


    End Class


 


    ' Extend My.Application Class


    Partial Friend Class MyApplication


 


        Public Function AppTest() As String


            Return "For Test Purposes"


        End Function


 


    End Class


 


End Namespace


 


ويمكنك الآن توسيع مجال الأسماء My بحسب حاجتك وهذا ليس محدودا بتطبيق معين حيث يمكنك إنشاء مكتبة Class Library خاصة بك تضيف بعض الأشياء لمجال الأسماء My واستخدامها في تطبيقاتك وذلك بإضافة مرجع لهذه المكتبة من داخل التطبيق


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة samerselo @ ٩:٠٩ م   0 تعقيبات
مقدمة إلى 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 تعقيبات
الصفحة الرئيسية
Google Search
Google
       

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

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