قواعد المشاركة في المنتدى

(منتدى الأكسس) الموضوع:المساعدة فى عمل شاشة دخول مستخدمين ليكتمل البرنامج بواسطة: (ابراهيم حورس) :: (منتدى الأكسس) الموضوع:طلب مساعده في حليل قاعدة بيانات بواسطة: (kaser906) :: (منتدى الأكسس) الموضوع:كود يظهرسجلات الشهر الحالى بواسطة: (nacer_alger) :: (قسم الاعلانات) الموضوع:ذبايح للبيع بالرياض مع التوصيل0554435958 اغنام للبيع بالرياض بواسطة: (عبدالرحمان) :: (منتدى الأكسس) الموضوع:اظهار البيانات المتشابهه من الجدول الثاني عند الاستعلام بواسطة: (raed99) :: (منتدى الأكسس) الموضوع:اين المشكلة في عملية النسخ الاحياطي بواسطة: (أبو تسنيم) :: (منتدى ADO.NET العام) الموضوع:عمل ابحاث جامعية حصرية بواسطة: (فهد بن ال سعود) :: (منتدى الأكسس) الموضوع:استدعاء مسيرات الرواتب بناء على شرط معين بواسطة: (عمر الرشيدي) :: (قسم الاعلانات) الموضوع:قناة يوتيوب تضم جميع فيديوهات المشاهير بقناة واحدة فقط بواسطة: (mohammedsalha) :: (منتدى ADO.NET العام) الموضوع:حل واجب جامعي باسعار مناسبة بواسطة: (فهد بن ال سعود) :: (قسم الاعلانات) الموضوع:نمتاز بالدقة والمهارة- اعالى الخليج بواسطة: (كوين) :: (قسم الاعلانات) الموضوع:أفضل موقع أخباري عربي ينقل أخبار العالم بواسطة: (اسامة الاحمر) :: (منتدى الكتب الالكترونية) الموضوع:كتاب اهلا بالعالم مسلّي وممتع للمبرمجين المبتدئين والمحترفين بواسطة: (اداء مقنع) :: (أخبار التكنولوجيا) الموضوع:كسب المال من مواقع تصميم التطبيقات بواسطة: (اداء مقنع) :: (قسم الاعلانات) الموضوع:شقق للبيع ش الخمسين النزهه 2 برنى 150 م بواسطة: (جمعة عللاممن) :: (منتدى Microsoft Excel) الموضوع:معادلة في الاسهم بواسطة: (awad1) :: (قسم الاعلانات) الموضوع:ماكينة التشكيل الحراري للبلاستيك فاكيوم بواسطة: (asma79) :: (قسم الاعلانات) الموضوع:خط انتاج الفحم المضغوط تصنيع الشركة العصرية للصناعات الهندسية بواسطة: (asma79) :: (قسم الاعلانات) الموضوع:اسعار الدريسنج رووم بواسطة: (هند صبرى 100) :: (قسم الاعلانات) الموضوع:أحدث أجهزة الحضور والانصراف ماركة ID WATCHER بواسطة: (eng sara)


راديو القرآن

المواضيع المثبته: (قسم الدروس و الدورات) الموضوع:دروس بالفيديو في VB.NET 2005 بواسطة: (HnHn) :: (Oracle قسم قواعد البيانات أوراكل) الموضوع:Oracle Online Documentation .. best resource of Info about Oracle بواسطة: (adnan_som) :: (منتدى الأكسس) الموضوع:مثال على تغير الكائنات حسب مقاس الشاشه بواسطة: (startnet) :: (قسم المواضيع المميزة) الموضوع:أرشيف للمشاركات المتميزة بواسطة: (أبو أفنان) :: (منتدى التصميم والجرافيكس) الموضوع:دروس فوتوشوب تو توب بواسطة: (Professional VB99) :: (منتدى مبرمجي ASP) الموضوع:كتاب مكون من 16 جزاء يتكلم عن asp بواسطة: (amricost) :: (منتدى Microsoft Visual Basic) الموضوع:عرض الصور المخزنه في قاعدة البيانات بالكريستال ريبورت بواسطة: (ابو حمد) :: (قسم الدروس و الدورات) الموضوع:برمجة بصمة الاصبع مع الدوت نت Microsoft FingerPrint Reader بواسطة: (FunctionSys) :: (منتدى الدعم الفني للماسنجر المحيط العربي) الموضوع:مشاكل ماسنجر المحيط العربي بواسطة: (jbsa) :: (قسم البرامج الجاهزة و الاكواد) الموضوع:مشروع طبيب الاسنان مع السورس كود بواسطة: (ITPROGRAMMER) :: (قسم الدروس و الدورات) الموضوع:دوره مجانيه لاحتراف الدوت نت بواسطة: (alaa gomaa) :: (منتدى برمجة التقارير) الموضوع:أداة لطباعة اي DataGridView بواسطة: (jbsa) :: (منتدى مبرمجي لغة جافا JAVA) الموضوع:درس : الاستثناءات في جافا Exceptions بواسطة: (nardien28) :: (منتدى ADO.NET العام) الموضوع:انشاء قواعد البيانات برمجيا جداول - علاقات -قيود بواسطة: (شهرزاد) :: (منتدى الكتب الالكترونية) الموضوع:موقع لتحقق من وجود الكتاب الذى تبحث عنه بواسطة: (يوسف) :: (القسم المفتوح) الموضوع:إلا رسول الله صلى الله عليه وسلم بواسطة: (alanees) :: (Oracle قسم قواعد البيانات أوراكل) الموضوع:E-Business Suite بواسطة: (وليد القدسي) :: (Oracle قسم قواعد البيانات أوراكل) الموضوع:تعرف على تقنية Oracle APEX بواسطة: (وليد القدسي) :: (Oracle قسم قواعد البيانات أوراكل) الموضوع:ADF بواسطة: (وليد القدسي) :: (منتدى برمجة التقارير) الموضوع:كتاب كريستال ريبورت بواسطة: (شهرزاد)

عدد الصفحات : 3  1  2  3   > » إضافة رد إضافة موضوع جديد

> تعلم بالتفصيل LINQ Standard Operators,دورة في تقنية الاستعلام والاوامر الموحدة
Bookmark and Share
تقييم الموضوع Label معدل التقيم:0
مشاركةالاثنين,26/ذو القعدة/1429 هـ,09:17 صباحاً
المشاركة #1

خبيرتحليل نظم و دوت نت
الرتبة في المنتدى:عماد

أيقونة المجموعة

المجموعة: مشرفي الموقع
المشاركات: 3849
سجل في:الأحد,17/محرم/1428 هـ,05:57 صباحاً
الدولة:الأردن
رقم العضوية: 19244





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

LINQ Standard Operators
الاوامر الموحدة في لغة الاستعلام



اخواني الكرام

كما تعلمون تقنية LINQ هي جديدة في Vs 2008 وقد بدات بدراستها منذ فترة والان استطعت تحديد جميع عناصر والاوامر الموحدة لهذه التقنية وعددها (51) وسابدأ انشاء الله بشرحها جميعها وعلى عدة مشاركات مع مثال على كل واحدة منها.

والامثلة ستكون LINQ to Objects بمختلف انواعها وبعدها سيسهل جدا التعامل مع LINQ to DataSet و LINQ to SQL لانني سأقوم بشرح الأوامر الموحدة LINQ Standard Operators

وقد قمت بترتيب الاوامر حسب تصنيفها وعددهم (14) وساشرحها بالترتيب مع الصور في بعض الاحيان ونلخصها كما في الصورة التالية :



فهل ابدأ على بركة الله ام هناك أرآء اخرى

تحياتي للجميع


حررت من قبل: jbsa في الأربعاء,21/فر/1432 هـ,07:26 صباحاً
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالاثنين,26/ذو القعدة/1429 هـ,11:22 صباحاً
المشاركة #2

الرتبة في المنتدى:ملازم أول

أيقونة المجموعة

المجموعة: الأعضاء
المشاركات: 265
سجل في:الأحد,07/ذو الحجة/1428 هـ,06:42 صباحاً
الدولة:السعودية
رقم العضوية: 40511



ابدأ على بركة الله،،،

ياليت لو تمدنا ببعض المراجع للإستفادة...

صائب
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالثلاثاء,27/ذو القعدة/1429 هـ,10:10 صباحاً
المشاركة #3

خبيرتحليل نظم و دوت نت
الرتبة في المنتدى:عماد

أيقونة المجموعة

المجموعة: مشرفي الموقع
المشاركات: 3849
سجل في:الأحد,17/محرم/1428 هـ,05:57 صباحاً
الدولة:الأردن
رقم العضوية: 19244





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

تكرم اخي صائب ولكن بعد الانتهاء من شرح LINQ Standard Operators وذلك ليسهل على الجميع من فهم ما هو مذكور في المراجع بكل يسر

والان نبدأ

مقدمة :

تمر عملية الاستعلام في ثلاث مراحل وهي :

1- تحديد مصدر البيانات أو مصادر البيانات
2- بناء الاستعلام وهنا لا يعطينا أي نتائج
3- تنفيذ الاستعلام وهنا يعطينا النتائج

مثال لتوضيح ذلك
 كود

' مصدر البيانات
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' بناء الاستعلام
Dim Query1 = From num In numbers _
Where num Mod 2 = 0 _
Select num

' تنفيذ الاستعلام
For Each number In Query1
Console.Write(number & " ")
Next
النتيجة ستكون بالشكل التالي : 0 2 4 6


في هذا المثال نلاحظ ان مصدر البيانات هو عبارة عن مصفوفة والتي هي تتوافق مع ((IEnumerable(Of (T ومن هنا يمكن اعتبارها مصدر بيانات للاستعلام LINQ أي أن الأنواع التي تتوافق مع IEnumerable(Of T) أو المشتقة منها مثل IQueryable(Of (T)) تعتبر من النوع القابل للاستعلام Queryable.

وباعتبارها قابله للاستعلام والمصفوفة التي لا تحتاج إلى تعديل أو عمليات خاصة فانها تعد مصدر من مصادر بيانات LINQ وكذلك المجموعات التي من نوع IEnumerable(Of T), List(Of (T)), Dictionary(Of (TKey, TValue)) وكذلك أي Class ضمن إطار .net framework وإذا كانت مصادر البيانات لا تتطابق مع IEnumerable فإنها تحتاج إلى مزودات أخرى من LINQ provider مثل Linq to xml
linq to dataset , linq to sqlحيث تتولى هذه المزودات تحويله الى نوع القابل للاستعلام Queryable .

ونحن هنا بصدد شرح الصيغ من تتوافق مع النوع IEnumerable

الصيغة العامة للاستعلام :

وتحتوي على ثلاث فقرات رئيسية وهي From, Where, Select
 كود

Dim Query1 = From [Exp] In [Var]
Where [Cond]
Select [Exp]


Dim Query1 تعريف المتغير
From فقرة تحديد المتغيرات [Exp] (الحقول/العناصر) num في المثال السابق
In لتحديد مصدر البيانات
[Var] مصدر البيانات numbers في المثال السابق
Where فقرة الشرط
[Cond] الشرط num Mod 2 = 0 في المثال السابق
Select فقرة تحديد المخرجات [Exp] (الحقول/العناصر) num في المثال السابق

وتعريف الاستعلام يحفظ في متغير ينفذ لاحقا مثل Query1 في المثال السابق ويجب أن يكون من النوع القابل للاستعلام حيث أن Query1 هو IEnumerable(Of Integer) ويجب العلم بأنه عند تعريف الاستعلام لا ينفذ الاستعلام ولا يجلب البيانات وإنما فقط يحفظ تعريف الاستعلام وينفذ في المثال السابق عند تنفيذ جملة For Each .

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

بعد تعريف الاستعلام يمكن بعدها تنفيذه مباشرة مثل المثال السابق أو يمكن تنفيذه في إجراء أخر في وقت لاحق وفي هذه الحالة نسترجع قيمه واحدة من البيانات باستخدام الأوامر القياسية مثل Count, Max, Average…. و First مثال Dim Cnt = Query1.Count فهنا نحفظ في المتغير Cnt قيمة واحدة فقط وهي عدد العناصر في Query1.

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


للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالأربعاء,28/ذو القعدة/1429 هـ,05:59 صباحاً
المشاركة #4

الرتبة في المنتدى:ملازم أول

أيقونة المجموعة

المجموعة: الأعضاء
المشاركات: 265
سجل في:الأحد,07/ذو الحجة/1428 هـ,06:42 صباحاً
الدولة:السعودية
رقم العضوية: 40511



مشكور اخوي jbsa ,,,الدرس واضح كالعادة,,

ياليت تتوسع في "1- تحديد مصدر البيانات أو مصادر البيانات"قبل ان تدخل في باقي العناصر,,

اذا كنت لاتمانع طبعاً,,


صائب
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالأربعاء,28/ذو القعدة/1429 هـ,09:16 صباحاً
المشاركة #5

خبيرتحليل نظم و دوت نت
الرتبة في المنتدى:عماد

أيقونة المجموعة

المجموعة: مشرفي الموقع
المشاركات: 3849
سجل في:الأحد,17/محرم/1428 هـ,05:57 صباحاً
الدولة:الأردن
رقم العضوية: 19244





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

انشاء الله اخي صائب في الدرس القادم .

بعد أن عرفنا مراحل الاستعلام وآلية عملها نبدأ بشرح العمليات الموحدة في LINQ

1- عمليات تصفيه البيانات Filtering Data وتحتوي على أمرين Where , OfType ونستخدمها لعمل اختيار للبيانات حسب شرط معين أو حسب معادلة معينة أو حسب نوع معين ولنأخذ المثال التالي :
 كود

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim words() As String = {"My", "Name", "Is", "Jbsa", "Linq", "Standard", "Operations"}

Dim query1 = From word In words _
Where word.Length = 4 _
Select word

Dim query2 = words.AsEnumerable().Where(Function(word) word.Length = 4)

Dim query3 = words.AsQueryable().Where(Function(word) word.Length = 4)


Dim sb1, sb2, sb3 As New System.Text.StringBuilder()

For Each str As String In query1
sb1.AppendLine(str)
Next

For Each str As String In query2
sb2.AppendLine(str)
Next

For Each str As String In query3
sb3.AppendLine(str)
Next

' اظهار النتائج
MsgBox(sb1.ToString(), , "Query1")
MsgBox(sb2.ToString(), , "Query2")
MsgBox(sb3.ToString(), , "Query3")
End Sub


في هذا المثال وضعنا شرط لتصفية البيانات وهو أن يكون حجم الكلمات يساوي 4 وعند تنفيذ الإجراء تكون
النتيجة بالشكل التالي : للاستعلامات الثلاثة
 كود

Name
Jbsa
Linq


Query1 : هي من نوع Array وهنا تكون فلترة القيم على أساس قيمها الأصلية
Query2 : هي لفترة العناصر من نوع IEnumerable على أساس نوع محدد (ثابتة المحتويات)
Query3 : هي لفترة العناصر من نوع IQueryable على أساس نوع محدد (مصدر البيانات إما يكون من IEnumerable أو ان يكون معرف بـ Class)

==========================================

أما بالنسبة لعملية الفلترة حسب النوع OfType نستخدمها عندما تكون مصدر البيانات عبارة عن خليط غير محدد النوع مثال :

 كود

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Words As New System.Collections.ArrayList(5)
Words.Add("My")
Words.Add("Name")
Words.Add(2)
Words.Add("Is")
Words.Add(1.01)
Words.Add("Jbsa")

Dim query1 As IEnumerable(Of String) = Words.OfType(Of String)()

Dim output As New System.Text.StringBuilder("Elements of type 'string' are:" & vbCrLf)

For Each word As String In query1
output.AppendLine(word)
Next

Dim query2 As IEnumerable(Of Double) = Words.OfType(Of Double)()

output.AppendLine(vbCrLf & "Elements of type 'Double' are:")

For Each Word As Double In query2
output.AppendLine(Word)
Next

Dim query3 As IEnumerable(Of Integer) = Words.OfType(Of Integer)()

output.AppendLine(vbCrLf & "Elements of type 'Integer' are:")

For Each Word As Integer In query3
output.AppendLine(Word)
Next

MsgBox(output.ToString())

End Sub


هنا عرفنا مصفوفة بدون تحديد نوعها (خليط) وقمنا بتعبئتها بثلاث انواع ( string , Double,Integer ) ولفصلها حسب النوع نستخدم OfType

في query1 قمنا بالاستعلام عن البيانات من نوع String
في query2 قمنا بالاستعلام عن البيانات من نوع Double
في query3 قمنا بالاستعلام عن البيانات من نوع Integer

وستكون نتيجة تنفيذ الاستعلام بالشكل التالي :

 كود

Elements of type 'string' are:
My
Name
Is
Jbsa

Elements of type 'Double' are:
1.01

Elements of type 'Integer' are:
2


ونستخدم IQueryable في حالة عرفنا الخليط ب Class معين وبنفس الاسلوب.

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

وانشاء الله ساقوم بعمل امثلة لاحقا لاستخدام اكثر من مصدر بيانات و المصدر Class ايضا.


تحياتي للجميع

للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالخميس,29/ذو القعدة/1429 هـ,08:13 صباحاً
المشاركة #6

خبيرتحليل نظم و دوت نت
الرتبة في المنتدى:عماد

أيقونة المجموعة

المجموعة: مشرفي الموقع
المشاركات: 3849
سجل في:الأحد,17/محرم/1428 هـ,05:57 صباحاً
الدولة:الأردن
رقم العضوية: 19244





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

2- عمليات Projection ويمكن تفسيرها بـ(تصور ، تغيير أساسي) وتحتوي على أمرين Select , SelectMany ونستخدمها لعمل تحويل للقيم الأصلية أو جزء منها أو أن نأخذها نفسها عن طريق استخدام Function ولنأخذ المثال التالي :

 كود

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim sb As New System.Text.StringBuilder()
Dim words1 As New List(Of String)(New String() {"My", "Name", "Is", "Jbsa", "Linq", "Standard", "Operations"})

Dim query = From word1 In words1 _
Select word1.Substring(0, 2)

For Each Str As String In query
sb.AppendLine(Str)
Next

MsgBox(sb.ToString())
End Sub


في هذا المثال لاحظ أننا أخذنا جزء من القيم الأصلية فأصبحت القيم في الاستعلام تختلف عن القيم الأصلية والمقصود هنا استخدام Function هي المعرفة في فيجول بيسك مثل Substring و Split و Length أو عمل معادلة معينة.

===========================================

والمثال التالي لاستخدام SelectMany حيث أننا هنا يمكن أن نستخدم أكثر من جملة From (وهنا نأخذ البيانات من أكثر من مصدر) أو أن نستخدم جملة SelectMany وكلاهما تعطي نفس النتائج

 كود

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim sb As New System.Text.StringBuilder()

Dim words As New List(Of String)(New String() {"My Name Is Jbsa", "Linq Standard Operations"})

Dim query1 = From word1 In words _
From word2 In word1.Split(" "c) _
Select word2

Dim query2 = words.SelectMany(Function(word) word.Split(" "c))

sb.AppendLine("=======Select=======")

For Each str As String In query1
sb.AppendLine(str)
Next

sb.AppendLine()

sb.AppendLine("====SelectMany======")

For Each str As String In query2
sb.AppendLine(str)
Next

MsgBox(sb.ToString())
End Sub


في Query1 استعلمنا عن الجملتين الموجودة في words عن طريق From الأولى والتي حفظنا البيانات في المتغير Word1 ثم قمنا بالاستعلام مرة أخرى عن الكلمات الموجودة في Word1 عن طريق Form الثانية وحفظنا البيانات في Word2 باستخدام المعادلة Split ثم قمنا باختيار البيانات المقسمة في Word2 وتكون نتائج التنفيذ ل Query1 كما يلي :
 كود

My
Name
Is
Jbsa
Linq
Standard
Operations


ولو قمنا بتغيير جملة Select إلى Select Word1 ستتغير النتائج بحيث سيأخذ الجملتين في Word1 ويكررها بعدد الكلمات المقسمة في Word2 لكل جملة وستكون النتيجة كما يلي :
 كود

My Name Is Jbsa
My Name Is Jbsa
My Name Is Jbsa
My Name Is Jbsa
Linq Standard Operations
Linq Standard Operations
Linq Standard Operations


--------------------------------------------------------------------

في Query2 استعلمنا عن الجملتين الموجودة في words عن طريق SelectMany حيث كأنها تعمل على الاستعلام من أكثر من مصدر وهما الجملتين وهنا يجب استخدام Function لإجراء أي تغيير عليها (وإذا كانت هذه ال Function لا يوجد لها اسم (أي لا نقوم ببنائها ولا يوجد بها جمل ولا يوجد بها جملة Return ولا يوجد بها End Function وإنما تحتوي على معادلة معينة
 كود
Function(word) word.Split(" "c) )
تسمى بـ ( lambda Expression ) ، واستخدمت هنا نفس المعادلة التي استخدمناها في Query1 وهي Split حيث أنها تعطي نفس النتيجة وتكون على الشكل التالي :

 كود

My
Name
Is
Jbsa
Linq
Standard
Operations


------------------------------------------------------------------

ارجوا ارشادي وتنبيهي في حالة ان الدروس غير واضحة او غير مفهومة
وهل اكمل على نفس الاسلوب أم هناك آراء اخرى ؟!!!!.

تحياتي للجميع


للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالاثنين,03/ذو الحجة/1429 هـ,02:07 صباحاً
المشاركة #7

خبيرتحليل نظم و دوت نت
الرتبة في المنتدى:عماد

أيقونة المجموعة

المجموعة: مشرفي الموقع
المشاركات: 3849
سجل في:الأحد,17/محرم/1428 هـ,05:57 صباحاً
الدولة:الأردن
رقم العضوية: 19244





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

نتابع الان مع المجموعة الثالثة من الاوامر :

3- فصل (تقسيم) البيانات Partitioning Data
ونستخدمها للقيام بتقسيم البيانات المتسلسلة إلى قسمين دون إعادة ترتيب العناصر وتكون نتيجة الاستعلام عن قسم واحد من القسمين. ونستخدم الأوامر التالية فيها :

Skip : وهي للقفز عن عدد العناصر التي نحددها ثم يأخذ العناصر الباقية وبشكل متسلسل.

 كود

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim words As New List(Of String)(New String() {"My", "Name", "Is", "Jbsa", "Linq", "Standard", "Operations"})

Dim query = From word In words Skip 4

Dim sb As New System.Text.StringBuilder()
For Each str As String In query
sb.AppendLine(str)
Next

MsgBox(sb.ToString())
End Sub


في هذا المثال نقفز عن أول أربع عناصر (كلمات) ويأخذ العناصر الباقية وتكون النتيجة كما يلي :

 كود

Linq
Standard
Operations


SkipWhile : وهي اقفز عن العناصر ما دامت تحقق شرط معين أو معادلة معينة وبشكل متسلسل.

وهنا إذا لم يتحقق الشرط على أول عنصر فان الشرط ينتهي ولا يقوم بفحص العناصر الأخرى حسب الشرط ويأخذ جميع العناصر. إما إذا تحقق الشرط على العنصر الأول ولم يتحقق على العنصر الثاني مثلا فيقفز عن الأول ويأخذ باقي العناصر. وأما إذا تحقق الشرط على العنصر الأول والثاني ولم يتحقق على العنصر الثالث فيقفز عن أول عصرين ويأخذ الباقي وهكذا (أي انه يقف عن الاستعلام عند عدم تحقق الشرط ولا يكمل فحص باقي العناصر).

 كود

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
Dim words As New List(Of String)(New String() {"My", "Name", "Is", "Jbsa", "Linq", "Standard", "Operations"})

Dim query = From word In words Skip While word.Substring(0, 1) <> "J"

Dim sb As New System.Text.StringBuilder()

For Each str As String In query
sb.AppendLine(str)
Next

MsgBox(sb.ToString())

End Sub


في هذا المثال وضعنا شرط أن يقفز عن العناصر التي لا يبدأ الحرف الأول فيها ب J فهنا تحقق الشرط على أول ثلاث عناصر ولم يتحقق على العنصر الرابع فهنا يقفز عن أول ثلاث عناصر ويأخذ الباقي وتكون النتيجة :

 كود

Jbsa
Linq
Standard
Operations


Take : وهي لأخذ العناصر بالعدد الذي نحدده وبشكل متسلسل.

 كود

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
Dim words As New List(Of String)(New String() {"My", "Name", "Is", "Jbsa", "Linq", "Standard", "Operations"})

Dim query = From word In words Take 4

Dim sb As New System.Text.StringBuilder()

For Each str As String In query
sb.AppendLine(str)
Next

MsgBox(sb.ToString())

End Sub


في هذا المثال حددنا له أن يأخذ أول 4 عناصر فقط وتكون النتيجة :

 كود

My
Name
Is
Jbsa


TakeWhile : وهي لأخذ العناصر ما دامت تحقق شرط معين أو معادلة معينة وبشكل متسلسل.

وهنا إذا لم يتحقق الشرط على أول عنصر فان الشرط ينتهي ولا يقوم بفحص العناصر الأخرى حسب الشرط ولا يأخذ أي عنصر. إما إذا تحقق الشرط على العنصر الأول ولم يتحقق على العنصر الثاني مثلا فيأخذ أول عنصر فقط وأما إذا تحقق الشرط على العنصر الأول والثاني ولم يتحقق على العنصر الثالث ليأخذ العنصر الأول والثاني فقط وهكذا (أي انه يقف عن الاستعلام عند عدم تحقق الشرط ولا يكمل فحص باقي العناصر).

 كود

Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
Dim words As New List(Of String)(New String() {"My", "Name", "Is", "Jbsa", "Linq", "Standard", "Operations","Code"})

Dim query = From word In words Take While word.Length < 5

Dim sb As New System.Text.StringBuilder()

For Each str As String In query
sb.AppendLine(str)
Next

MsgBox(sb.ToString())

End Sub


وفي هذا المثال وضعنا شرط أن يأخذ العناصر التي حجمها اقل من 5 أحرف وهنا تحقق الشرط على أول 5 عناصر ولم يتحقق على العنصر السادس فيأخذ أول 5 عناصر وتكون النتيجة :

 كود

My
Name
Is
Jbsa
Linq


طبعاً هنا يمكن عمل جميع هذه الأمثلة بوضع الشروط على عدة طرق ونأخذ المثال الأخير هنا

الطريقة العادية
 كود

Dim query = From word In words Take While word.Length < 5


طريقة Function lambda Expression

 كود

Dim query = From word In words.TakeWhile(Function(Len) Len.Length < 5
)

طريقة AsEnumerable

 كود

Dim query = words.AsEnumerable.TakeWhile(Function(Len) Len.Length < 5)


طريقة AsQueryable

 كود

Dim query = words.AsQueryable.TakeWhile(Function(Len) Len.Length < 5)


وجميع هذه الطرق تعطي نفس النتيجة.
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالاثنين,03/ذو الحجة/1429 هـ,07:54 صباحاً
المشاركة #8

الرتبة في المنتدى:ملازم أول

أيقونة المجموعة

المجموعة: الأعضاء
المشاركات: 265
سجل في:الأحد,07/ذو الحجة/1428 هـ,06:42 صباحاً
الدولة:السعودية
رقم العضوية: 40511



في انتظار اكتمال الوضوع,,

كي لاتتشتت الأفكار

صائب
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالأربعاء,05/ذو الحجة/1429 هـ,03:03 صباحاً
المشاركة #9

مشرف سابق لمنتدى VB.NET ADO.NET
الرتبة في المنتدى:لواء

أيقونة المجموعة

المجموعة: المشرفين القدامى
المشاركات: 1592
سجل في:الثلاثاء,26/شعبان/1427 هـ,09:40 صباحاً
الدولة:الأردن
رقم العضوية: 13584



ما شاء الله عليك اخي الغالي jpsa
نحن بانتظار المزيد وفقكم الله
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالأربعاء,05/ذو الحجة/1429 هـ,08:07 صباحاً
المشاركة #10

خبيرتحليل نظم و دوت نت
الرتبة في المنتدى:عماد

أيقونة المجموعة

المجموعة: مشرفي الموقع
المشاركات: 3849
سجل في:الأحد,17/محرم/1428 هـ,05:57 صباحاً
الدولة:الأردن
رقم العضوية: 19244





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

شكرا لك اخي حسين وجزاك الله خيرا

ونكمل الان المجموعة الرابعة وهو يحتاج الى تركيز وانتباه .

4- ضم (دمج) Join Operations

ونستخدمها للقيام بعملية ضم أو دمج مصدرين من البيانات عن طريق عنصر يحتوي (على نفس المواصفات ) في المصدر الآخر والحصول على مصدر واحد.
حيث أن عملية Joining مهمة في الاستعلام وذلك للاستعلام عن البيانات مصدر أخر مرتبط معه بعلاقة معينه ، وهي تحتوي على أمرين Join و GroupJoin



Join : joins Inner وهي تعمل على ضم العناصر بين المصدرين في مصدر واحد في التي تتطابق فيها المفاتيح في كلا المصدرين وهذا يكون مثل INNER JOIN in SQL ، ونستخدمه للاستعلام عن البيانات بمقارنة المفتاح في كلا المصدرين بالتساوي equals وهنا نستخدم الصيغة

 كود
join … in … on … equals … [And … equals …]


ويمكن استخدام في Join بشكل ضمني وعن طريق استخدام الصيغة

 كود
From x In …, y In … Where x.a = b.a [And x.d = b.d]


وهنا يجب أن نقوم بشرح جملة أخرى في Linq حيث أننا سوف نستعملها في المثال لاحقا وهي


Let Clause: وهي غير مذكورة بالجدول في المشاركة الأولى وذلك لأنها لا تندرج تحت تصنيف معين.

وتستخدم هذه الجملة لتعريف متغير داخل نفس الاستعلام وحساب قيم مختلفة وتخزينها في المتغير ويمكن تعريف أكثر من متغير في نفس الجملة وذلك لاستخدامه في جمل أخرى من نفس الاستعلام مثل جملة where أو يمكن اعتباره مصدر أخر من مصادر البيانات. والصيغة العامة لها :

 كود
Let variable = expression [, ...]


وهذا مثال بسيط لها

 كود
Dim strings As New List(Of String)(New String() {"My Name Is Jbsa.", _
"Linq Standard Operations.", _
"The Let Clause Sample."})

Dim StrQuery = From sentence In strings _
Let words = sentence.Split(" "c) _
From word In words _
Let w = word.ToLower _
Where w(0) = "j" Or w(0) = "l" Or w(0) = "c" Or w(0) = "s" _
select word

Dim sb As New System.Text.StringBuilder()

For Each ww In StrQuery
sb.AppendLine(ww)
Next

MsgBox(sb.ToString)


نلاحظ في هذا المثال إننا في ال from الأولى استعلمنا عن الجمل وقمنا بتعريف متغير words لتخزين الكلمات في الجملة ثم قمنا بالاستعلام في from الثانية عن كلمة من الكلمات من المتغير الذي قمنا بتعريفه words وقمنا بتعريف متغير أخر W لتخزين أول حرف من الكلمة وبعدها استخدمنا هذا المتغير في جملة where للاستفسار عن أول حرف وطباعة الكلمة. وتكون نتيجة تنفيذه بهذا الشكل
 كود

Jbsa.
Linq
Standard
Let
Clause
Sample.


جرب تغير جملة select إلى (sentence أوw ) ولاحظ التغيير في النتيجة ، ولو غيرتها إلى words فلن يعطيك نتيجة لأنها من نوع مصفوفة إلا إذا قمت بتحديد الخانة ww(0) للعنصر الأول.


أما ألان لنعود لمثال جملة join

وفي هذا المثال سوف نقوم باستيراد البيانات من ملفات text أو Csv وهي التي تكون البيانات فيها مخزنة بشكل Delimited التي تفصل بينها فواصل معينة (, ; فراغ tab ) أو غيرها ولعمل ذلك
افتح برنامج Excel وادخل البيانات بالشكل التالي :

jbsa jbsa 77
محمد محمود 11
محمود عباس 22
خالد احمد 33
عباس راشد 44
راشد تميم 55
احمد محمد 66

واعمل Save As Csv وسميه مثلا book1.csv

ثم قم بعمل ملف أخر بنفس الطريقة وخزن البيانات التالية فيه وسمية book2.csv

11 80   85   90   95
22 50   60   70   80
33 60   70   80   60
44 50   70   60   65
55 60   50   80   90
66 80   65   75   85
77 96   95   94   98

والبيانات في الملف الأول هي الاسم الأول للطالب والاسم الثاني ورقمه وفي الملف الثاني رقم الطالب وأربع نتائج امتحان وهنا سيخزن Delimited وحسب ما هي محددة عندك في برنامج Excel حيث يمكن أن تختلف من شخص لأخر عندي مثلا محددها بـ (<img src=http://www.arabmoheet.net/forum/editor/smiles/wink2.gif border=0>.

وأيضا نحتاج إلى تعريف Structure معين لحفظ معلومات الطالب وبالشكل التالي :
 كود

Structure Students
Public FirstName As String
Public LastName As String
Public Id As Integer
End Structure

Structure Scores
Public Id As Integer
Public Exam1 As Integer
Public Exam2 As Integer
Public Exam3 As Integer
Public Exam4 As Integer
Public Avg As Double
End Structure


ونبدأ بقراءة الملفات التي قمنا بإنشائها أولا ونخزنها في متغيرات من نوع string. ثم نقوم ببناء الاستعلام بعدة طرق ونحتاج هنا إلى datagradview لإظهار النتائج :
 كود

Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
Dim names As String() = System.IO.File.ReadAllLines("E:\MyProjects\DvD-Temp\LINQ\Book1.csv", System.Text.Encoding.Default)
'jbsa jbsama 77
'محمد محمود 11
'محمود عباس 22
'خالد احمد 33
'عباس راشد 44
'راشد تميم 55
'66 احمد محمد
Dim scores As String() = System.IO.File.ReadAllLines("E:\MyProjects\DvD-Temp\LINQ\Book2.csv")
'11 80   85   90   95
'22 50   60   70   80
'33 60   70   80   60
'44 50   70   60   65
'55 60   50   80   90
'66 80   65   75   85
'77 96   95   94   98

' NameS: First[1] , Last[0] , ID[2],
' jbsa , jbsama , 77
' ScoreS: StudentID[0], Exam1[1], Exam2[2], Exam3[3], Exam4[4], Grade Level[3]
' 77 , 96 , 95 , 94 , 98 ,

Dim Query = From name In names _
Let n = name.Split(New Char() {";"c}) _
From id In scores _
Let s = id.Split(New Char() {";"c}) _
Where n(2) = s(0) _
select New With {.ID = n(2), .First = n(0), .Last = n(1), _
.Exam_1 = s(1), .Exam_2 = s(2), .Exam_3 = s(3), .Exam_4 = s(4), _
.Avg = (From se In s Skip 1 _
select Convert.ToInt32(se)).Average}

DataGridView1.DataSource = Query.ToList

'---------------------------------------------------------------------------------------------------------------------

Dim query1 = From na In names.select(Function(n) n.Split(";"))

Dim Student As New List(Of Students)

Dim st As New Students
For Each s In query1
st.Id = Convert.ToInt32(s(2))
st.FirstName = s(0)
st.LastName = s(1)
Student.Add(st)
Next

Dim query2 = From ga In scores.select(Function(n) n.Split(";"))

Dim Score As New List(Of Scores)

Dim sc As New Scores
For Each s In query2
sc.Id = Convert.ToInt32(s(0))
sc.Exam1 = Convert.ToInt32(s(1))
sc.Exam2 = Convert.ToInt32(s(2))
sc.Exam3 = Convert.ToInt32(s(3))
sc.Exam4 = Convert.ToInt32(s(4))
sc.Avg = (From av In s Skip 1 select Convert.ToDouble(av)).Average
Score.Add(sc)
Next

'---------------------------------------------------------------------------------------------------------------------

Dim query3 = From q1 In Student, q2 In Score _
Where q1.Id = q2.Id _
select q1.Id, q1.FirstName, q1.LastName, q2.Exam1, q2.Exam2, q2.Exam3, q2.Exam4, q2.Avg

DataGridView2.DataSource = query3.ToList

'---------------------------------------------------------------------------------------------------------------------


Dim queryJoin = From q1 In Student _
Join q2 In Score On q1.Id Equals q2.Id _
Where q2.Avg > 70 _
select q1.Id, q1.FirstName, q1.LastName, q2.Exam1, q2.Exam2, q2.Exam3, q2.Exam4, q2.Avg

DataGridView3.DataSource = queryJoin.ToList

End Sub


في Query الاولى استخدمنا join بالطريقة الضمنية عن طريق استخدام where وهي واضحة حيث قمنا بشرحها بالامثلة السابقة ولكن التغير الوحيد فيها في جملة select حيث نستخدم هذه الطريقة
 كود

select New With {.ID = n(2), .First = n(0), .Last = n(1), _
.Exam_1 = s(1), .Exam_2 = s(2), .Exam_3 = s(3), .Exam_4 = s(4), _
.Avg = (From se In s Skip 1 _
select Convert.ToInt32(se)).Average}


وذلك لان المتغيرات التي قمنا بتخزينها في جمل Let تخزن على شكل Array ولذلك نقوم باختيارها بالشكل السابق حيث اننا نعرف الترويسة التي نرغب باظهاراها ثم نخزن بها القيمة المطلوبة بمعنى اننا نخزنها بشكل مصفوفة . ( ونستخدم هذه الطريقة select New With عند الرغبة بتغيير أسماء ألترويسه أو طريقة ترتيب المعلومات حيث أننا سنظهر المعلومات في Datagridview).

وهنا نريد حساب المعدل حيث انه غير مخزن لدينا ولذلك قمنا بانشاء استعلام (تحويل Array الى نوع IEnumerable القابلة للاستعلام) واستخدمنا Function Average المعرف في Linq "والذي سوف نقوم بشرحها بالتفصيل لاحقا " ، واستخدمنا هنا أمر Skip (والذي قمنا بشرحه سابقا) وذلك لأننا نرغب باستثناء رقم الطالب عند حساب معدل العلامات.

ونستطيع هنا أن نستغني عن هذه الطريق select New With بتحول المتغيرات في جملة let الى نوع IEnumerable كما فعلنا عند حساب المعدل ، ولتوضيح ذلك استخدمت الطريقة الثانية وهي عن طريق تحويل المعلومات إلى نوع IEnumerable تخزينها على شكل سجلات وهنا قمنا بقراءة البيانات في query1 ثم خزنتها في list وعلى شكل سجل الطلاب Students وفي query2 قرانا العلامات وخزناها على شكل list العلامات Scores ثم قمنا في query3 بعمل join الضمنية عن طريق Where واستخلاص النتائج من معلومات الطلاب Student ومعلومات العلامات Score التي نرغب بإظهارها في جملة select وهنا لن نستطيع تغيير الترويسه إلا إذا استخدمنا select New With.

ونستطيع دمج query1 و query2 في query3 لتكون جملة استعلام واحدة ولكن لم استخدم هذه الطريقة لكي يسهل فهم طريقة عملها.


أما طريقة استخدام طريقة join الفعلية فقمت بإنشاء queryJoin وهي لضم مصدر معلومات الطلاب Student مع مصدر معلومات العلامات Score ووضعنا جملة where لتوضيح أننا يمكن عمل فلتره للذي معدلهم أكثر من 70 .

ويجب أن نذكر هنا انه في حالة وجود طلاب لا يوجد لهم علامات في المصدر الثاني Score ينفذ الأمر ويستثني الطلاب الذين لا يوجد لهم علامات وكذلك حالة العكس وجود علامات لطالب ولكن لا يوجد سجل للطالب أيضا يقوم باستثناء هذه العلامات ويقوم بضم الطلاب فقط الذي يتساوى رقم الطالب بها في المصدرين.

وعند تنفيذ الاستعلامات الثلاثة السابقة تعطي نفس النتائج ما عدا الأخير الذي قمنا بوضع له فلتره المعدل اكبر من 70 ولو ألغينا الفلتره ستعطي نفس النتائج.
===================================================


GroupJoin : وهي ضم البيانات لمصدرين في مصدر واحد هرمي عن طريق تساوي المفاتيح بين المصدرين ويكون المصدر الناتج جميع العناصر (Outer Left) من المصدر الأول وتندرج تحتها بشكل هرمي جميع النتائج من المصدر الثاني التي يتطابق فيها المفتاح مع المصدر الثاني ، وفي حالة عدم تطابق المفتاح في كلا المصدرين يأخذ النتائج من المصدر الأول بشرط عدم القيام بعمليات حسابية على بيانات المصدر الثاني. وهذا مثل LEFT OUTER JOIN in SQL

سنقوم هنا باستخدام بعض المعلومات من المثال السابق وسنقوم باجراء تغيير على طريقة تخزين سجل العلامات افتح برنامج Excel ثم قم بعمل ملف أخر بنفس الطريقة وخزن البيانات التالية فيه وسمية book3.csv

11 80
11 85
11 90
11 95

وهكذا للطلاب السبعه وأيضا نحتاج إلى تعريف Structure معين لحفظ سجل العلامات وبالشكل التالي :
 كود

Structure Grads
Public Id As Integer
Public Exam As Integer
End Structure


وذلك لتكون بشكل هرمي أي يوجد تكرار لرقم الطالب

 كود
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
Dim names As String() = System.IO.File.ReadAllLines("E:\MyProjects\DvD-Temp\LINQ\Book1.csv", System.Text.Encoding.Default)

Dim Grad As String() = System.IO.File.ReadAllLines("E:\MyProjects\DvD-Temp\LINQ\Book3.csv")
'11 80
'11 85
'11 90
'11   95
'77 96
'77   95
'77   94
'77   98

Dim query1 = From na In names.select(Function(n) n.Split(";"))

Dim Student As New List(Of Students)

Dim st As New Students
For Each s In query1
st.FirstName = s(0).ToString
st.LastName = s(1).ToString
If String.IsNullOrEmpty(s(2)) Then
st.Id = 0
Else
st.Id = Convert.ToInt32(s(2))
End If
Student.Add(st)
Next

Dim query2 = From ga In Grad.select(Function(n) n.Split(";"))

Dim Score As New List(Of Grads)

Dim sc As New Grads
For Each s In query2
sc.Id = Convert.ToInt32(s(0))
If String.IsNullOrEmpty(s(1)) Then
sc.Exam = 0
Else
sc.Exam = Convert.ToInt32(s(1))
End If
Score.Add(sc)
Next

Dim queryOuterRight = From q1 In Student _
Group Join q2 In Score _
On q1.Id Equals q2.Id _
Into q1q2 = Group _
From q3 In q1q2.DefaultIfEmpty _
select q1.Id, q1.FirstName, q1.LastName, q1q2.Count, q3.Exam


DataGridView1.DataSource = queryOuterRight.ToList

Dim queryOuterLeft1 = From q1 In Student _
Group Join q2 In Score _
On q1.Id Equals q2.Id _
Into q1q2 = Group, Total = Sum(q2.Exam) _
select q1.Id, q1.FirstName, q1.LastName, q1q2.Count, Total

DataGridView2.DataSource = queryOuterLeft1.ToList
Try
Dim queryOuterLeft2 = From q1 In Student _
Group Join q2 In Score _
On q1.Id Equals q2.Id _
Into q1q2 = Group, Total = Sum(q2.Exam), Average = Average(q2.Exam) _
select q1.Id, q1.FirstName, q1.LastName, q1q2.Count, Total, Average

DataGridView3.DataSource = queryOuterLeft2.ToList
Catch ex As Exception

End Try


End Sub


في الاستعلام query1 , query2 نخزن معلومات الطلاب في Student و Score

في الاستعلام queryOuterRight نقوم بعملة ضم معلومات الطالب بعلامات الطالب وهنا حيث انه يقوم بجلب جميع الطلاب من المصدر Student وضم جميع علاماتهم وإذا لم توجد لهم علامات يظهرها إذا استخدمنا DefaultIfEmpty ويعطيها قيمة صفر ويستثنيها إذا لم نستخدم DefaultIfEmpty وهنا يعطينا النتائج مكررة حسب ما هي في المصدر الثاني يعني أننا نجلب البيانات Outer Right ويستثني العلامات التي لا يوجد لها طالب .

في الاستعلام queryOuterLeft1 نقوم بعملية ضم معلومات الطالب بعلامات الطالب وهنا يجلب جميع بيانات المصدر Student ويقوم بعملة تجميع لبيانات المصدر الثاني التي يتساوى رقم الطالب فيها وضمها لمعلومات الطالب دون تكرار وإذا لم توجد لهم علامات يظهرها ويعطيها قيمة صفر ولا يستثنيها ولكن يستثني العلامات التي لا يوجد لها طالب Outer Left ويكون هذا الاستعلام صحيح ما لم نستخدم فيه أوامر لعمليات حسابية على العلامات.

في الاستعلام queryOuterLeft2 نقوم بعملية ضم معلومات الطالب بعلامات الطالب وهنا يجلب جميع بيانات المصدر Student ويقوم بعملة تجميع لبيانات المصدر الثاني التي يتساوى رقم الطالب فيها وضمها لمعلومات الطالب دون تكرار وإذا لم توجد لهم علامات (يعطي نتيجة خطأ ولا ينفذ الاستعلام) وذلك لأننا استخدمنا عمليات حسابية على العلامات ، ولكن يستثني العلامات التي لا يوجد لها طالب Outer Left ويكون هذا الاستعلام صحيح .( وهنا استخدمت try لعدم إعطاء خطأ على البرنامج في حالة حدوثه ولكن لن يظهر أي نتائج).


جرب بان تضيف طالب دون إضافة علامات ونفذ الاستعلام وجرب ان تضيف علامات دون ان تضيف لهم طالب ونفذ الاستعلام.

تحياتي للجميع


حررت من قبل: jbsa في الأربعاء,21/فر/1432 هـ,07:30 صباحاً
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة

    

عدد المتصفحين لهذا المنتدى «1»: (الضيوف «1» - المتخفون «0»)
الأعضاء «0»: .

عدد الصفحات : 3  1  2  3   > » إضافة رد جديد إضافة موضوع جديد



 
الوقت الأن:اليوم,02:22 مساءً بتوقيت القدس المحتلة

Powered By arabmoheet v3.1

منتديات المحيط العربي  -  راسلنا  -   أعلى
X   رسالة المنتدى
(سوف يتم اغلاق هذه النافذة بعد 2 ثانية)
X   رسالة المنتدى
(سوف يتم اغلاق هذه النافذة بعد 2 ثانية)