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

(منتدى الأكسس) الموضوع:مساعدة في التفقيط بالانكليزي بواسطة: (weamman) :: (قسم الاعلانات) الموضوع:شركة اوركن الأمريكية لمكافحة الحشرات والآفات بالسعودية 100 سنة من الخبرة بواسطة: (بحار الانترنت) :: (قسم الاعلانات) الموضوع:تنظيف وتسليك البالوعات بواسطة: (كوين) :: (منتدى الأكسس) الموضوع:ممكن مساعدة في ListBox بواسطة: (musbah1978) :: (قسم الاعلانات) الموضوع:احدث غرف نوم استيل 2018و اجمل غرف نوم بنى دهب استيل و غرف نوم لستيل بنى 2018 بواسطة: (رمز الهنا) :: (قسم الاعلانات) الموضوع:فاعليات مشاركة تكنوبوند بمعرض جدة الدولى بواسطة: (tbond) :: (منتدى البرامج) الموضوع:سناب تيوب snaptube للكمبيوتر بواسطة: (احمد فؤاد 2018) :: (قسم الاعلانات) الموضوع:sasher body acyion جهاز رياضى متكامل للرجال والنساء بواسطة: (korossama) :: (قسم الاعلانات) الموضوع:جهاز حضور والانصراف ZKTeco موديل X628 -T بواسطة: (eng sara) :: (منتدى مبرمجي Microsoft Visual C#.NET) الموضوع:How Save and retreve Image in sql server database بواسطة: (Abu Ehab) :: (قسم الاعلانات) الموضوع:تصميم تطبيقات الموبايل مع أطياف بواسطة: (موشن جرافيك) :: (قسم الاعلانات) الموضوع:دليل الخدمات المنزلية بواسطة: (realtime) :: (قسم الاعلانات) الموضوع:شركة نقل اثاث بالرياض ضفاف الخليج بواسطة: (realtime) :: (قسم الاعلانات) الموضوع:طرق تنظيف الكنب الجلد بواسطة: (سجيات) :: (منتدى مبرمجي Microsoft Visual VB.NET) الموضوع:ادراج رابط صورة في جدول واستدعائها بواسطة: (hitman47) :: (قسم الاعلانات) الموضوع:تصميم وبرمجة تطبيقات الهواتف الذكية مع أطياف بواسطة: (موشن جرافيك) :: (قسم الاعلانات) الموضوع:كن أول من يحمل التطبيق الرسمي لموقع مطبخ أم رميساء بواسطة: (ضيااء) :: (منتدى الأكسس) الموضوع:مساعدة عاجلة من اهل الخبرة بواسطة: (startnet) :: (قسم الاعلانات) الموضوع:لايف الهلال السعودي قل رايك حول المباريات بواسطة: (korossama) :: (منتدى مبرمجي لغة جافا JAVA) الموضوع:عندي مشكلة في ربط برنامجي الجافا بالاكسس بواسطة: (omob)


راديو القرآن

المواضيع المثبته: (منتدى مبرمجي لغة جافا JAVA) الموضوع:برنامج للموبايل بلغة الجافا للبحث على جوجل بواسطة: (Doctors) :: (Oracle قسم قواعد البيانات أوراكل) الموضوع:يجب المرور هنا للأهمية بواسطة: (وليد القدسي) :: (منتدى مبرمجي ASP) الموضوع:دورة احترافيه لبناء منتدى على asp بواسطة: (عبدالله جابر شقليه) :: (قسم التعاميم والشكاوي) الموضوع:صفحة منتديات المحيط العربي على الفيس بوك بواسطة: (ramies) :: (منتدى الوورد والباور بوينت) الموضوع:مكتبة الباور بوينت بواسطة: (ramies) :: (منتدى مبرمجي ASP) الموضوع:مشروع تخرج القرية الذكية المصرية بواسطة: (caco) :: (منتدى برمجة الشبكات في بيئة الدوت نت) الموضوع:Dot Net Networks & TCP/IP Programming بواسطة: (fmo_82) :: (منتدى برمجة الجرافكس) الموضوع:الجزء الاول من دروس تعلم GDI بواسطة: (alaa gomaa) :: (منتدى الكتب الالكترونية) الموضوع:كتاب لبرامج مصممة بالفيجوال مع أكوادها (الجزء الثاني) بواسطة: (First Star) :: (منتدى Microsoft Visual Basic) الموضوع:كيفية إنشاء نظام شؤون الموظفين من الصفر بواسطة: (zoubicom) :: (منتدى البرامج) الموضوع:7 اسطوانات لتعليم شهاده ICDL بالصوت والصوره بواسطة: (مستشفى الكمبيوتر) :: (منتدى مبرمجي Microsoft Visual C#.NET) الموضوع:موسوعة الأكواد بواسطة: (fmo_82) :: (منتدى مبرمجي ASP) الموضوع:شرح كود موقع شؤون الموظفين النسخة الأولى بواسطة: (alanees) :: (قسم الـ portable) الموضوع:أفضل برامج مفيدة للكمبيوتر وتعمل Portable اي بدون تنصيب بواسطة: (أبو ليان) :: (منتدى برمجة الألعاب) الموضوع:أسس تصميم الألعاب ال3Dالتفاعلية بواسطة: (مصطفي البارودي) :: (منتدى برمجة الشبكات في بيئة الدوت نت) الموضوع:عمل برنامج بسيط مع قاعدة بيانات اكسس على شبكة محلية بواسطة: (allnsh 3) :: (قسم الدروس و الدورات) الموضوع:لتحميل مجموعة امثله على الفيجوال بيسيك دوت نت 2005 بواسطة: (HnHn) :: (قسم الاعلانات) الموضوع:الرجاء عدم تكرار الاعلانات حتي يستفيد الجميع من المنتدي بواسطة: (startnet) :: (منتدى برمجة الألعاب) الموضوع:مجموعة من مشاريع الالعاب بواسطة: (مصطفي البارودي) :: (منتدى Microsoft Visual Basic) الموضوع:الموضوع الشامل عن جهاز الباركود BarCode بواسطة: (Max Bayne)

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

> دورة في LINQ To DataSet,دورة الاستعلام من الجداول بالتفصيل
Bookmark and Share
تقييم الموضوع Label معدل التقيم:5
مشاركةالخميس,26/محرم/1430 هـ,08:03 صباحاً
المشاركة #1

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

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

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





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

LINQ To DataSet



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

نبدأ اليوم دورة جديدة وهي في LINQ To DataSet وارجو ممن يرغب بمتابعة هذه الدورة ان يقوم اولا بدراسة الدورة السابقة وهي LINQ Standard Operators (الاوامر الموحدة في لغة الاستعلام) من هذا الرابط


LINQ Standard Operators



حيث ان هذه الدورة تتعلق بشكل مباشر وشبة كامل بالدورة السابقه

مقدمة :

Linq to dataset تجعل طريقة الاستعلام عن البيانات المحملة في dataset بشكل سريع وسهل ، و linq تعمل على تبسيط طريقة الاستعلام وتسمح للمطورين والمبرمجين لكتابة الاستفسارات عن طريق اللغة نفسها بدلا من استخدام لغة منفصلة ، ونستفيد منها في Vs بحيث أنها توضح لنا إذا كان هناك أخطاء في أثناء كتابة الاستفسارات ، وهي تسمح لنا بعمل الاستفسارات عن البيانات من مصدر أو أكثر ، وهذا يتيح الكثير من السيناريوهات التي تتطلب المرونة في كيفية تمثيل البيانات والتعامل معها ، مثل الاستعلام عن البيانات المجمعة محليا والطبقة المتوسطة في التخزين المؤقت لتطبيقات الانترنت والتقارير العامة وتحليل البيانات والإحصاء.

وهي احد فروع مصادر البيانات ويمكن تلخيص Linq بهذه الصورة



فإن LINQ To Dataset تعرض أساسا من خلال توسيع الطرق في DataRowExtensions classes وDataTableExtensions classes.

LINQ To Dataset تستند إلى البيانات والاستخدامات القائمة على ADO.NET 2.0 ، وليس المقصود أن تحل محل ADO.NET 2.0 في البرنامج. ويوضح الرسم البياني التالي العلاقة بينهم



البيانات هي واحدة من أكثر العناصر المستخدمة على نطاق واسع ADO.NET. ومن العناصر الرئيسية لنموذج البرمجة المنفصلة تعتمد على ADO.NET ، وتمكنك من استخدام بيانات من مصادر مختلفة للبيانات. لعرضها بشكل صفوف ، أو مع controls for data-binding ، وتوفر حفظ شكل البيانات ذات العلاقة ، وتتضمن سرعة وبساطة الاستفسار بشكل هرمي ، ومعالجة البيانات في الذاكرة ، وكيفية إظهار البيانات في التطبيق ويوضح الرسم البياني التالي العلاقة :



بعد تحميل البيانات في Dataset نستطيع عمل الاستعلام عليها مثل ما تم شرحه في الدورة السابق في Linq Standard Operation ويضاف هنا بعض الأوامر الخاصة بمصدر البيانات ولاحظ هنا أننا عند الاستعلام في Dataset أننا نتعامل مع Enumeration of DataRow أو Enumeration of a Custom type وهذا يعني أننا نستطيع استخدام أي عناصر (حقول) في DataRow في الاستعلام Linq وهذا يتيح لنا عمل الكثير من الاستعلامات المعقدة ، وإذا أردنا إن نستخدم DataTable كمصدر للبيانات في جملة From فهنا يجب أن نستخدم AsEnumerable Method.


ولبناء مشروع على Linq To Dataset يجب إضافة ال Reference التالية :

System.Core.dll
System.Data.dll
System.Data.DataSetExtensions.dll
System.Data.Linq



ويمكن إضافة أيضا ال Reference وذلك حسب نوع اتصالك ((Connection في البيانات :

System.Data.Common
System.Data.SqlClient



ويمكن أن نستخدم Linq To Dataset بشكلين :

الأول : Query Expression Syntax وهي طريقة التعبير اللغوي والتي هي مثل أوامر SQL التي نستخدمها في VS ، والتي يمكن أيضا استخدام جميع أوامر Standard Query Operators.

وهذا مثال على استخدام جملة select لاسترجاع جميع السجلات من جدول وتخزينها في متسلسلة من نوع

Data.EnumberableRowCollection(Of Data.DataRow)


 كود
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")
Dim Prod1 = From o In Product.AsEnumerable _
Where o.Field(Of Integer)("Target Level") > 100 _
select o
DataGridView1.DataSource = Prod1.AsDataView
End Sub


الثاني : Method-Based Query Syntax وهي طريقة التركيب اللغوي ( بناء الجمل) وهي سلسلة من الأوامر التي تنفذ مباشرة Calls Method Syntax والتي هي عبارة عن أوامر
Standard Query Operators والتي قمنا بشرحها في الدورة السابقة Linq Standard Query Operators أوامر لغة الاستعلام الموحدة ، واستخدام lambda expressions في المتغيرات

وهذا مثال على استخدام جملة select لاسترجاع جميع السجلات من جدول وتخزينها في متسلسلة من نوع

Data.EnumberableRowCollection(Of anonumous Type)

و anonumous Type هي الأنواع المجهولة (خليط من الأنواع) .

 كود
Dim query = Product.AsEnumerable().Where(Function(dt As DataRow) _
dt.Field(Of String)(" ProductName ") ="Computer") _
.select(Function(Prod As DataRow) _
New With {.Name = Prod.Field(Of String)("ProductName"), _
.Type = Prod.Field(Of String)("ProductType"), _
.Qty = Prod.Field(Of Double)("ProductQty")})

DataGridView1.DataSource = query.ToList


Linq To Dataset توفر الوصول إلى DataRow لقراءة قيم الأعمدة Column Values عن طريق

Field method : وتستخدم Field لقراءة القيم من DataRow .

SetField : تستخدم لإسناد القيم إلى DataRow

و SetField, Field تستطيع التعامل مع النوع Nullable type فهنا لا نقوم بفحص القيم عند قراءتها.

where P.Field(Of Double)("NetSales") > 100000



ويجب علينا تحديد النوع المناسب عند استخدام SetField, Field بالشكل المناسب لنوع البيانات .
حيث أن قراءة مثلا String ومقارنته في Integer هنا سيعطي خطأ InvalidCastException ، وكذلك اسم ال Coulmn يجب أن يكون نفسه الموجود في DataSet وإذا لم يتطابق الاسم سيعطي خطأ ArgumentException.

ولأن DataRow من الممكن أن تكون Null أو أن بعض Column فيها تكون Null فهنا يجب فحصها عند قراءتها باستخدام اسم Column بشكل مباشر أو باستخدام جملة Item (دون استخدام SetField, Field) ودون تحديد نوعه في الاستعلام وذلك لأنه سيعطي خطأ InvalidCastException إذا لم نقم بفحصها عند قراءة القيم وذلك بالشكل التالي :

Where P!NetSales IsNot DBNull.Value AndAlso P!NetSales > 100000



وفي حالة أن اسم Column يحتوي على فراغ فلا نستطيع كتابتها بهذه الطريقة ( P!Net Sales )فهنا نستخدم جملت Item والتي لا نحدد فيها النوع وكما في الطريقة التالية :

Where P.Item("Net Sales") IsNot DBNull.Value AndAlso P.Item("Net Sales") > 100000



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


حررت من قبل: jbsa في الأحد,17/جمادى الثانية/1431 هـ,05:18 صباحاً
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالأحد,29/محرم/1430 هـ,04:45 صباحاً
المشاركة #2

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

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

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





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


تركيب الاستعلامComposing Queries : امتداد الاستعلام



وكما تعلمون أن الاستعلام لا ينفذ بشكل مباشر إلا في حالة أن الأوامر لها خاصية التنفيذ الفوري Sum,Count أو في استخدام أوامر التي بدايتها To ، وكذلك يمكن أن نقوم بتركيب استعلام على استعلام أخر فهنا لا ينفذ الاستعلام الأول ولا ينفذ الاستعلام الثاني إلا في حالة إن الأوامر لها خاصية التنفيذ الفوري Sum,Count أو في استخدام أوامر التي بدايتها To .

 كود
Dim Product As DataTable = DS.Tables("Products")

Dim Query = From P In Product.AsEnumerable _
Where P.Field(Of String)("ProductName") = "Computer" _
Select P


فهنا هذا الاستعلام وهو من نوع Of DataRowلا ينفذ إلا عند إسناد له أمر Query.AsDataView أو Tolist أو ....... ،

ودعنا نركب استعلام أخر على هذا الاستعلام مثلا :

 كود
Dim largeProducts = Query.Where(Function(p) p.Field(Of Double)(" ProductQty") > 100) _
.Select(Function(o As DataRow) _
New With {.Name = o.Field(Of String)(" ProductName"), _
.Number = o.Field(Of String)(" ProductNo"), _
.NetShare = o.Field(Of Double)(" ProductQty ")})


الاستعلام Query لا ينفذ هنا وإنما يتمدد (يتوسع ليشمل الاستعلام الثاني ) ثم ينفذ الاستعلام كوحدة واحدة عند تنفيذ الاستعلام largeProducts وفي حالة استخدامه في هذه الجملة :

DataGridView2.DataSource = largeProducts.ToList



وهنا لا نستطيع تنفيذ الاستعلام AsDataView وذلك لأنه أصبح من نوع Of anonumous Type لأننا قمنا باختيار جزء من DataRow ) ولتنفيذ الاستعلام AsDataView يكون بالطريقة التالية وهنا سيجلب جمع الحقول

 كود
Dim largeProducts = Query.Where(Function(p) p.Field(Of Double)(" ProductQty") > 100) _
.Select(Function(o As DataRow) o)


هنا نستطيع تنفيذه بهذه الطريقة :

DataGridView2.DataSource = largeProducts. AsDataView



وبعد تنفيذ هذا الاستعلام فلا يمكن لنا أن نقوم بتركيب (توسع الاستعلام) وذلك لان البيانات أصبحت في الذاكرة.


Single-Table Queries (LINQ to DataSet)
استخدام جدول واحد



وهي أن نقوم بعمليات الاستعلام من جدول واحد فقط (مصدر بيانات واحد) من ال DataSet، ونستطيع تطبيق عليه جميع الأوامر الموحدة Linq Standard Query Operators

 كود
Dim Product As DataTable = DS.Tables("Products")

Dim Query = From P In Product.AsEnumerable _
Where P.Field(Of String)("ProductName") = "Computer" _
Select P


Cross-Table Queries (LINQ to DataSet)
استخدام اكثر من جدول



وهي أن نقوم بعمليات الاستعلام على جدولين (مصدرين) من ال DataSet، يتقاطعان في حقل معين أي أن هذين الحقلين متساويين في القيمة ومن نفس النوع ويعتبر هذا InnerJoin والذي يمكن تمثيله في Linq على انه Join وليس شرطاً أن نقوم بعمل علاقة بين الجدولين حيث انه عند تحويلهما AsEnumerable يمكن أن نقوم بربطهم بأي حقل متطابق في القيمة والنوع في كلا الجدولين ، ونستطيع تطبيق جميع الأوامر الموحدة Linq Standard Query Operators .

 كود

Dim Product As DataTable = DS.Tables("Products")
Dim Order As DataTable = DS.Tables("Order")

Dim Query = From P In Product.AsEnumerable _
Join O In Order.AsEnumerable _
On P.Field(Of Double)("ProductNo") Equals O.Field(Of Double)("OrderProductNo") _
Where (O.Field(Of Integer)("OrderQty") >= 100) _
Order By O.Field(Of Date)("OrderDate") Descending _
Select New With {.Name = P.Field(Of String)("ProductName"), _
.ID = P.Field(Of String)("ProductCode"), _
.NetQty = O.Field(Of Double)("OrderQty"), _
.Date = O.Field(Of Date)("OrderDate")}

DataGridView3.DataSource = Query.ToList




Comparing DataRows (LINQ to DataSet)
مقارنة DataRow وتحتوي على عدة أوامر وهي Set Operators :


Distinct , Union , Intersect , Except هذه الأوامر تقوم بعمل مقارنة العناصر عن طريق Class GetHashCode and Equals على كل عنصر من عناصر DataRow وهي تقوم بالمقارنة حسب مرجعيته reference comparison وبما أننا هنا نرغب بعمل المقارنة حسب قيم العناصر لذلك .
LINQ to DataSet توفر هذه المقارنة عن طريق استخدام Class DataRowComparer وذلك لمقارنة قيم العناصر في DataRow

فمثلا

Equals(DataRow, DataRow)

تعطينا True في حالة كانت قيم العناصر متساوية في كلا DataRow وغير ذلك يعطينا False

وهذا مثال على هذه الأوامر الأربعة بالإضافة إلى المقارنة بالتساوي :

 كود
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
Dim Product As DataTable = Me.NORTHWNDDataSet.Products

Dim query1 = From Pro1 In Product.AsEnumerable() _
Where Pro1.Field(Of String)("category") = "Beverages" _
Select Pro1

Dim query2 = From Pro2 In Product.AsEnumerable() _
Where Pro2.Field(Of String)("supplier ids") = "4" _
Select Pro2

Dim Prod1 = query1.CopyToDataTable().AsEnumerable
DataGridView1.DataSource = Prod1.CopyToDataTable

Dim Prod2 = query2.CopyToDataTable().AsEnumerable
DataGridView2.DataSource = Prod2.CopyToDataTable
MsgBox("Union")
Dim UnionProd = Prod1.Union(Prod2).OrderBy(Function(x) x.Item(1))
DataGridView3.DataSource = UnionProd.CopyToDataTable

MsgBox("Distinct")
Dim DistinctProd = UnionProd.AsEnumerable.Distinct(DataRowComparer.Default)
DataGridView3.DataSource = DistinctProd.CopyToDataTable

MsgBox("Intersect")
Dim IntersectProd = Prod1.Intersect(Prod2, DataRowComparer.Default)
DataGridView3.DataSource = IntersectProd.CopyToDataTable

MsgBox("Except")
Dim ExceptProd = Prod1.Except(Prod2, DataRowComparer.Default)
DataGridView3.DataSource = ExceptProd.CopyToDataTable

MsgBox("Rows Equal")
DataGridView3.DataSource = UnionProd.CopyToDataTable
'compares two rows and gets their hash codes
Dim left = UnionProd.CopyToDataTable.Rows(0)
Dim right = UnionProd.CopyToDataTable.Rows(1)

' Compare the two different rows.
Dim comparer As IEqualityComparer(Of DataRow) = DataRowComparer.Default
Dim bEqual = comparer.Equals(left, right)

If (bEqual = True) Then
MsgBox("First Two rows are equal")
Else
MsgBox("First Two rows are not equal")
End If
End Sub


وهنا لا داعي لان أقوم بشرح الأوامر وذلك لأننا قمنا بشرحها في الدورة السابقة.
واذكر أن الأوامر Union , Intersect , Except تكون على مصدرين وأما Distinct تكون على مصدر واحد.

وهنا أنبه انه من خصائص Union الجمع دون تكرار ولكن في المثال هذا تعطينا تكرار وذلك بسبب أنني لم استخدم DataRowComparer.Default حتى احصل على سجلات مكررة استطيع مقارنتها بالتساوي وإذا رغبنا بتنفيذها غير مكرره نجعلها بالشكل التالي :

 كود
Dim UnionProd = Prod1.Union(Prod2, DataRowComparer.Default).OrderBy(Function(x) x.Item(1))


وهنا سيعطي عند المقارنة بالتساوي False .

ولمقارنة DataRow مع بعضهما استخدم

IEqualityComparer(Of DataRow)

حيث Left, Right من نوع DataRow وهنا

bEqual = comparer.Equals(left, right)

تعطينا True إذا كانت قيم جميع الحقول متساوية في الاثنين وإلا تعطينا False .

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

للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالاثنين,30/محرم/1430 هـ,08:11 صباحاً
المشاركة #3

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

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

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





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

Creating a DataTable From a Query (LINQ to DataSet)
خلق DataTable عن طريق الاستعلام



عند استخدام Data binding عادة تكون على DataTable وحتى نستطيع استخدام Data binding على نتائج الاستعلام يجب علينا استخدام أمر CopyToDataTable حيث انه يحول نتائج الاستعلام إلى DataTable ويحتوي على نفس خصائص وأسماء الحقول في DataSet ونفس اسم DataTable مضاف له كلمة "Query" إذا كان الاستعلام من مصدر واحد .
أما إذا كان الاستعلام من أكثر من مصدر فانه ينتج عندنا DataTable يحتوي على أسماء الحقول التي تم تحديدها ولا يكون له نفس اسم DataTable وعليك تحديد اسم DataTable .
وإذا كان الاستعلام يعطي نتائج فارغة فانه يخلق DataTable يحتوي على نفس خصائص وأسماء الحقول ويكون فارغ.

وفي المثال السابق قمنا باستخدام هذا الأمر.

Creating a Custom CopyToDataTable<T> Method And Type Not a DataRow
انشاء DataTable حسب الطلب (ما يرغب به المبرمج) .



خلق DataTable عن طريق الاستعلام باستخدام مصدر بيانات من نوع IEnumerable(Of T) حيث إن T هي نوع DataRow حيث انه لا يسمح بتكون جداول عن طريق سلسلة تحتوي على بيانات من نوع anonymous types أو عن طريق الاستعلامات المستخدم فيها أمرjoin أو Select New With (اخذ جزء من حقول DataTable) وحتى نستطيع عمل ذلك يجب علينا عمل Class ObjectShredder خاص بذلك وإجراء بعض التغيير على Class CopyToDataTable وأرفق لكم ال Class و Module وهما من شركة Microsoft وليس من برمجتي وعليك وضعهم في برنامجك كما هم : دون إجراء أي تغيير عليهم حيث أننا نستخدم Class ObjectShredder في الإجراء
CopyToDataTableCustom الذي في ال Module .

 كود
Imports System.Data.Linq
Imports System.Reflection
Public Class ObjectShredder(Of T)
' Fields
Private _fi As FieldInfo()
Private _ordinalMap As Dictionary(Of String, Integer)
Private _pi As PropertyInfo()
Private _type As Type

' Constructor
Public Sub New()
Me._type = GetType(T)
Me._fi = Me._type.GetFields
Me._pi = Me._type.GetProperties
Me._ordinalMap = New Dictionary(Of String, Integer)
End Sub

Public Function ShredObject(ByVal table As DataTable, ByVal instance As T) As Object()
Dim fi As FieldInfo() = Me._fi
Dim pi As PropertyInfo() = Me._pi
If (Not instance.GetType Is GetType(T)) Then
' If the instance is derived from T, extend the table schema
' and get the properties and fields.
Me.ExtendTable(table, instance.GetType)
fi = instance.GetType.GetFields
pi = instance.GetType.GetProperties
End If

' Add the property and field values of the instance to an array.
Dim values As Object() = New Object(table.Columns.Count - 1) {}
Dim f As FieldInfo
For Each f In fi
values(Me._ordinalMap.Item(f.Name)) = f.GetValue(instance)
Next
Dim p As PropertyInfo
For Each p In pi
values(Me._ordinalMap.Item(p.Name)) = p.GetValue(instance, Nothing)
Next

' Return the property and field values of the instance.
Return values
End Function


' Summary : Loads a DataTable from a sequence of objects.
' source parameter: The sequence of objects to load into the DataTable.</param>
' table parameter : The input table. The schema of the table must match that
' the type T. If the table is null, a new table is created
' with a schema created from the public properties and fields of the type T.
' options parameter: Specifies how values from the source sequence will be applied to
' existing rows in the table.
' Returns : A DataTable created from the source sequence.

Public Function Shred(ByVal source As IEnumerable(Of T), ByVal table As DataTable, ByVal options As LoadOption?) As DataTable

' Load the table from the scalar sequence if T is a primitive type.
If GetType(T).IsPrimitive Then
Return Me.ShredPrimitive(source, table, options)
End If

' Create a new table if the input table is null.
If (table Is Nothing) Then
table = New DataTable(GetType(T).Name)
End If

' Initialize the ordinal map and extend the table schema based on type T.
table = Me.ExtendTable(table, GetType(T))

' Enumerate the source sequence and load the object values into rows.
table.BeginLoadData()
Using e As IEnumerator(Of T) = source.GetEnumerator
Do While e.MoveNext
If options.HasValue Then
table.LoadDataRow(Me.ShredObject(table, e.Current), options.Value)
Else
table.LoadDataRow(Me.ShredObject(table, e.Current), True)
End If
Loop
End Using
table.EndLoadData()

' Return the table.
Return table
End Function

Public Function ShredPrimitive(ByVal source As IEnumerable(Of T), ByVal table As DataTable, ByVal options As LoadOption?) As DataTable
' Create a new table if the input table is null.
If (table Is Nothing) Then
table = New DataTable(GetType(T).Name)
End If
If Not table.Columns.Contains("Value") Then
table.Columns.Add("Value", GetType(T))
End If

' Enumerate the source sequence and load the scalar values into rows.
table.BeginLoadData()
Using e As IEnumerator(Of T) = source.GetEnumerator
Dim values As Object() = New Object(table.Columns.Count - 1) {}
Do While e.MoveNext
values(table.Columns.Item("Value").Ordinal) = e.Current
If options.HasValue Then
table.LoadDataRow(values, options.Value)
Else
table.LoadDataRow(values, True)
End If
Loop
End Using
table.EndLoadData()
' Return the table.
Return table
End Function
Public Function ExtendTable(ByVal table As DataTable, ByVal type As Type) As DataTable
' Extend the table schema if the input table was null or if the value
' in the sequence is derived from type T.
Dim f As FieldInfo
Dim p As PropertyInfo

For Each f In type.GetFields
If Not Me._ordinalMap.ContainsKey(f.Name) Then
Dim dc As DataColumn

' Add the field as a column in the table if it doesn't exist
' already.
dc = IIf(table.Columns.Contains(f.Name), table.Columns.Item(f.Name), table.Columns.Add(f.Name, f.FieldType))

' Add the field to the ordinal map.
Me._ordinalMap.Add(f.Name, dc.Ordinal)
End If

Next

For Each p In type.GetProperties
If Not Me._ordinalMap.ContainsKey(p.Name) Then
' Add the property as a column in the table if it doesn't exist
' already.
Dim dc As DataColumn
dc = IIf(table.Columns.Contains(p.Name), table.Columns.Item(p.Name), table.Columns.Add(p.Name, p.PropertyType))

' Add the property to the ordinal map.
Me._ordinalMap.Add(p.Name, dc.Ordinal)
End If
Next

' Return the table.
Return table
End Function

End Class


وكذلك هذا ال Module

 كود
Imports System.Runtime.CompilerServices
Public Module LINQCustomtoDataSetMethods
<Extension()> _
Public Function CopyToDataTableCustom(Of T)(ByVal source As IEnumerable(Of T)) As DataTable
Return New ObjectShredder(Of T)().Shred(source, Nothing, Nothing)
End Function

<Extension()> _
Public Function CopyToDataTableCustom (Of T)(ByVal source As IEnumerable(Of T), ByVal table As DataTable, ByVal options As LoadOption?) As DataTable
Return New ObjectShredder(Of T)().Shred(source, table, options)
End Function

End Module



وبعد وضعهم في برنامجك فانك تستطيع عمل DataTable من أي مصدر من نوع IEnumerable(Of T) من نوع anonymous types سواء كان الاستعلام يستخدم Join أو Select New With أو المصدر من نوع تكوين أو Class وتكون أسماء الحقول ونوعيتها كما نضعها في جملة Select أو الأسماء في التكوين أو Class وتأخذ الحقول نفس خصائصهم ونوعهم.

مثال على ذلك : في هذا المثال قمنا بعمل Select New With لثلاث حقول فهذا الاستعلام سيكون نوعه EnumberableRowCollection(Of anonumous Type) ولا نستطيع تحويله إلى DataTable
باستخدام الأمر CopyToDataTable ، ولتحويل نتيجة الاستعلام إلى نوع يقبل أن يحول إلى DataTable فنقوم باستخدام الأمر الذي في ال Module وهو CopyToDataTableCustom والذي يقوم بتنفيذ Class ObjectShredder وتحويل الحقول والبيانات إلى DataTable ويأخذ نفس خصائص وأسماء الحقول التي حددناها في جملة Select New With .

أما لو كان نوعه EnumberableRowCollection(Of DataRow) فنستطيع تحويله إلى DataTable باستخدام الأمر CopyToDataTable في حالة قمنا بعمل جملة Select o

 كود
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")

Dim Prod1 = From o In Product.AsEnumerable _
Where o.Field(Of Integer)("Target Level") > 100 _
Select o

Dim Prod2 = From o In Product.AsEnumerable _
Where o.Field(Of Integer)("Target Level") > 100 _
Select New With {.Id = o.Field(Of Integer)("Id"), _
.ProductName = o.Field(Of String)("Product Name"), _
.TargetLevel = o.Field(Of Integer)("Target Level") }

DataGridView1.DataSource = Prod1. CopyToDataTable

DataGridView2.DataSource = Prod2.ToList

DataGridView3.DataSource = Prod2.CopyToDataTableCustom
End Sub


ضع المؤشر على Prod1 وسترى أن نوعه Of DataRow ثم ضع المؤشر على Prod2 وسترى أن نوعه Of anonumous Type .
في DataGridView1 يقوم بإظهار البيانات ونستطيع إدخال بيانات جديدة أو تعديل البيانات ونعامله معاملة DataTable.
في DataGridView2 نظهر الاستعلام Prod2 ولا نستطيع إدخال بيانات جديدة ولكن نستطيع التعديل على البيانات ولا نستطيع معاملته معاملة DataTable.
في DataGridView3 تم تحويلها الاستعلام Prod2 باستخدام الأمر CopyToDataTableCustom إلى DataTable وتقبل التعديل وتستطيع عمل Edit عليها وتستطيع إدخال سجلات جديدة وتعاملها معاملة DataTable من تخزينه كجدول جديد في DataSet وتخزينه أيضا في DataBase والأمور الأخرى أيضا.

وهذا مثال آخر لتكوين وتحويله إلى DataTable وهو تكون لقاموس ويحتوي على رقم والكلمة ومعناها

 كود
Structure ArabDiction
Public Id As Integer
Public English As String
Public Arabic As String
End Structure

Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click

Dim Dict As New List(Of ArabDiction)(New ArabDiction() _
{New ArabDiction With {.Id = 1, .English = "My", .Arabic = "انا"}, _
New ArabDiction With {.Id = 2, .English = "Name", .Arabic = "اسمي"}, _
New ArabDiction With {.Id = 3, .English = "Book", .Arabic = "كتاب"}, _
New ArabDiction With {.Id = 4, .English = "Man", .Arabic = "رجل"}})

Dim DictToTable = From d In Dict Select d.Id, d.Arabic, d.English

DataGridView1.DataSource = dictTable.ToList

DataGridView2.DataSource = dictTable.CopyToDataTableCustom

'ويمكن استخدامها بهذه الطريقة ايضا
'Dim T2 As DataTable = DictTable.CopyToDataTableCustom
'DataGridView2.DataSource = T2
End Sub


في الاستعلام DictToTable ونوعه IEnumberable(Of anonumous Type) لا نستطيع إظهار نتيجة الاستعلام في DataGridView1 إلا عند استخدام ToList أو ToArray وهنا لا يمكن لنا أن نقوم بعمل أي تعديل علية أو إضافة سجل جديد أو عمل Edit على أي حقل من حقوله في DataGridView1

ولتحويل هذا النوع إلى DataTable نستخدم الأمر CopyToDataTableCustom وهنا في DataGridView2 نعامله معاملة DataTable ونستطيع إضافة سجل جديد أو التعديل على أي حقل من حقوله.

وحتى لو قمنا بتغيير جملة Select في الاستعلام إلى (Select d ) فانه هنا لن يقوم بإظهار أي نتيجة وحتى لو استخدمنا ToList أو ToArray فلن يظهر المعلومات في DataGridView1 لأننا قمنا بعمل Select للتكون كامل ولان الاستعلام سيكون من نوع التكوين IEnumberable(Of ArabDiction) . ولكن يمكن تحويله في هذه الحالة إلى DataTable عن طريق CopyToDataTableCustom وسيظهر البيانات في DataGridView2.

ويمكن تعريف متغير من نوع DataTable وإسناد له نتائج الاستعلام باستخدام الأمر CopyToDataTableCustom كما هو موجود بالمثال أعلاه.


تحياتي للجميع
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالثلاثاء,01/فر/1430 هـ,06:04 مساءً
المشاركة #4

مشرف لمنتدى الفيجوال 6
الرتبة في المنتدى:لواء

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

المجموعة: مشرفي الأقسام
المشاركات: 1510
سجل في:الخميس,01/ربيع الأول/1427 هـ,12:13 صباحاً
الدولة:مصر
رقم العضوية: 9481



ما شاء الله ربنا يبارك فيك اخي العزيز ويزيدك من علمه

للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالأربعاء,02/فر/1430 هـ,01:48 صباحاً
المشاركة #5

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

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

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





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

شكرا لمرورك الكريم اخي Max Bayne وجزاك الله خيرا.

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



Data Binding and LINQ to DataSet
عمل Binding للبيانات عن طريق LINQ to DataSet





في LINQ to DataSet نستطيع إنشاء العديد من الاستعلامات والتي تكون من نوع Enumeration Of DataRow ولكنه ليس من السهل استخدام هذا النوع في binding ولذلك نستطيع خلق DataView من الاستعلامات في LINQ to DataSet وهنا نستطيع استخدام binding و filtering و sorting و أن LINQ to DataSet تمد بفاعلية الكثير من التعابير العادية والمعقدة في عمليات الفلترة والترتيب والفرز أكثر من عمليات الفلترة والترتيب الموجودة في DataView الأساسية ، ويجب العلم هنا أن هذه DataView تمثل نفس نتائج الاستعلام وليس الاستعلام نفسه ونستطيع في هذه الحالة استخدامها في DataGrid أو DataGridView أو binding وكذلك نستطيع عمل DataView من DataTable عن طريق استخدام الأمر default view من الجدول table.


Creating a DataView, Filtering, Sorting (LINQ to DataSet)
انشاء DataView و عملية الفلترة والترتيب




وحتى نستطيع إنشاء DataView من نتائج الاستعلام عن طريق الأمر AsDataView .
(علمان بان نتائج الاستعلام التي تكون من نوع anonymous types أو يستخدم Join أو Select New أو المصدر من نوع تكوين أو Class لا تنشأ DataView عن طريق هذا الأمر AsDataView)

وهذه الأوامر فقط التي يمكن استخدامها في الاستعلام لإنشاء DataView عن طريق الامر AsDataView في الاستعلام وهي :

Cast(Of TResult), OrderBy ,OrderByDescending ,Select(Of TRow, S),ThenBy, ThenByDescending ,Where(Of TRow)



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

وهذا مثال عليها
 كود
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")
Dim Prod1 = From o In Product.AsEnumerable _
Where o.Field(Of Integer)("Target Level") > 100 _
Order By o.Field(Of Integer)("ID"), o.Field(Of String)("Product Name") _
Select o

DataGridView1.DataSource = Prod1.AsDataView

Dim ProdView As DataView = Prod1.AsDataView

bindingSource1.DataSource = ProdView

DataGridView2.DataSource = BindingSource1

End Sub


حيث انه أنشأنا dataview من نتائج الاستعلام وقمنا بعمل binding له ، وهنا يمكن أن نقوم بعمل ترتيب وفلترة على ProdView عن طريق الأوامر المعروفة ل DataView وهي

ProdView.Sort = "ID desc"


ProdView.RowFilter = "ID =1"



Querying the DataRowView Collection in a DataView
الاستعلام عن DataRowView في ال DataView



وهنا سنشرح كيف نقوم باستخدام DataView كمصدر في LINQ to DataSet ونستطيع إجراء علية جميع عمليات الاستعلام. ونشرح الطريقة بالمثال التالي :

 كود
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")
Dim Prod1 = From o In Product.AsEnumerable _
Where o.Field(Of Integer)("Target Level") > 50 _
Order By o.Field(Of Integer)("ID"), o.Field(Of String)("Product Name") _
Select o

Dim ProdTable As DataTable = Prod1.CopyToDataTable

Dim ProdView As DataView = ProdTable.AsDataView()

DataGridView1.DataSource = ProdTable

ProdTable.Rows(0).Delete()

ProdTable.Rows(1)("List Price") = 20.0

ProdTable.Rows(2)("List Price") = 30.0

DataGridView2.DataSource = ProdView

ProdView.RowStateFilter = DataViewRowState.ModifiedCurrent Or DataViewRowState.Deleted

Dim modifiedDeletedQuery = From rowView As DataRowView In ProdView _
Select rowView

DataGridView3.DataSource = modifiedDeletedQuery.ToList

End Sub


في ProdTable قمنا بتحويل نتيجة الاستعلام الى DataTable و في ProdView قمنا بأخذ Dataview من DataTable وبعد ذلك قمنا بإلغاء السجل الأول وتعديل السعر في السجل الثاني والثالث ثم حددنا حالة الفلتره للسجلات في ProdView في السجلات المعدلة والسجلات الملغاة ولاحظ هنا إننا قمنا بالإلغاء من ProdTable ولكن النتيجة تنعكس بشكل تلقائي في ProdView لأنها نسخة من ProdTable ثم بعد ذلك قمنا بعمل استعلام من نوع ienumerable collection( of DataRowView) واستخدمنا ProdView كمصدر للبيانات في الاستعلام ، وهنا لا يمكن لنا تحولها إلى DataTable عن طريق الأمر CopyToDataTableCustom وذلك لأنها من نوع Of DataRowView وليست من نوع Of DataRow أو تكوين أو Class ....، وهنا سيقوم بإظهار السجلات المشطوبة والمعدلة في DataGridView3 عن طريق الأمر Tolist.

وألان ماذا لو أردنا أن نأخذ البيانات من bindingSource والتي تكون على شكل DataView ثم نقوم بعمل استعلام عليها وإعادة تحويل جزء منها إلى DataTable

نوضح الطريقة بالمثال التالي :

 كود
Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click

Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")
BindingSource1.DataSource = Product.AsDataView

Dim view As DataView = CType(BindingSource1.DataSource, DataView)

' Dim productsTable As DataTable = CType(view.Table, DataTable)

view.RowStateFilter = DataViewRowState.CurrentRows

Dim productQuery = From rowView As DataRowView In view _
Where rowView.Row.Field(Of Int16)("Reorder Level") = 10 _
Order By rowView.Row.Field(Of Decimal)("List Price") _
Select New With {.Name = rowView.Row.Field(Of String)("Product Name"), _
.ReorderLevel = rowView.Row.Field(Of Int16)("Reorder Level"), _
.Price = rowView.Row.Field(Of Decimal)("List Price")}

Dim Dt As DataTable = productQuery.CopyToDataTableCustom

DataGridView1.DataSource = Dt
End Sub


قمنا في View بتحويل البيانات التي في BindingSource1.DataSource إلى نوع DataView (ونستطيع تحويل DataView الى DataTable كما في ProductTable وذكرتها هنا للعلم) .
ثم قمنا بعمل استعلام productQuery واستخدمنا DataView كمصدر للبيانات وبعدها نقوم بإعادة تحويل الاستعلام وهو من نوع ienumerable collection(of anonymous types) والذي يمكن تحويله إلى DataTable عن طريق الأمر CopyToDataTableCustom.



DataView Performance In Find and FindRows
اداء DataView في البحث شيء ما أو البحث عن سجل



تتميز DataView بأدائها بشكل فعال في البحث عن سجل أو سجلات معينه وذلك لأنها مبنية على فهرس Index مكون من حقل أو أكثر حيث أن قيم هذه المفاتيح key((index تكون مرتبطة مع السجلات Rows مما يزيد من سرعتها وفعاليتها في عملية البحث .
وفي حالة استخدام Sorting, filtering تبنى هذه المفاتيح مرتين
الأولى عند إنشاء DataView والثانية عند استخدام Sorting, filtering يعاد بناء المفاتيح وفي هذه الحالة تقل سرعة وفعالية DataView.
ولذلك يفضل استخدام Find and FindRows في حالة أردنا تنفيذ Find and FindRows لمرة واحد نستطيع تنفيذها مباشرة على DataView أما إذا ارغب بتنفيذ Find and FindRows عدة مرات وبحقول مختلفة يفضل إنشاء نسخة جديدة من DataView لإعادة بناء المفاتيح على الحقل الذي ارغب البحث عنه وهذا الشيء يكون أسرع وأكثر فعالية.

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

للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالخميس,03/فر/1430 هـ,10:53 صباحاً
المشاركة #6

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

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

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





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


Cross-Table With Relations Queries (LINQ to DataSet)
استخدام اكثر من جدول بوجود علاقة بين الجداول



في حالة وجود علاقة بين الجداول يمكن أو يمكن إضافتها في حالة عدم وجودها وهنا يمكننا الاستعلام عن بيانات الجدولين بدون استخدام الأمر Join وهنا نستخدم الأمر GetChildRows للوصول إلى جميع اسطر وحقول الجدول المرتبط معه وهنا في هذا الأمر نحدد فقط اسم العلاقة حيث من الممكن أن يكون مرتبط بأكثر من جدول.
ونوضح ذلك بالمثال التالي :

 كود
Private Sub Button16_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button16.Click

Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")

Dim Order_Detail As DataTable = Me.NORTHWNDDataSet.Order_Details

' Me.NORTHWNDDataSet.Relations.Add("ProductOrderDetails", Product.Columns("ID"), _
' Order_Detail.Columns("Product ID"))

DataGridView1.DataSource = Product.AsDataView

DataGridView2.DataSource = Order_Detail.AsDataView

Dim Query = From h In Product.AsEnumerable _
Where h.Field(Of Int32)("Target Level") < 50 _
Order By h.Field(Of Int32)("ID") _
From ol In h.GetChildRows("ProductOrderDetails") _
Select New With {.Name = h.Field(Of String)("Product Name"), _
.ID = h.Field(Of Int32)("Id"), _
.Targel_Level = h.Field(Of Int32)("Target Level"), _
.Quantity = ol.Field(Of Decimal)("Quantity"), _
.Unit_Price = ol.Field(Of Decimal)("Unit Price"), _
.Count = h.GetChildRows("ProductOrderDetails").Count, _
.Total = h.GetChildRows("ProductOrderDetails").Sum(Function(x) x.Field(Of Decimal)("Quantity"))}

DataGridView3.DataSource = Query.CopyToDataTableCustom

End Sub


نعرف جدولين Product , Order_Detail وإذا لم يكن بينهم علاقة تقوم بإضافتها وهي Id=ProductId ونقوم بإظهار الجدولين في كل من DataGridView1 و DataGridView2 ثم نقوم بعمل الاستعلام بدون استخدام join للوصول إلى السجلات المرتبطة مع بعضها وهنا وضعت شرط معين لتقليل عدد النتائج فقط وهنا نستخدم الأمر GetChildRows("ProductOrderDetails") لتحديد السجلات المرتبطة مع هذا السجل ونقرأها وكأنها مصدر جديد ويمكن استخدامها أيضا داخل الاستعلام إذا رغبنا بتطبيق بعض العمليات وذلك باستخدام طريقة المعادلات Lambda Expression .



SetField And Field Method
طريقة استخدام SetField And Field



وقد شرحناها في المشاركة الأولى أن

Field : وتستخدم Field لقراءة القيم من DataRow وقد قمنا باستعمالها في كل الأمثلة تقريبا.

SetField : تستخدم لإسناد القيم إلى DataRow ولاحظ هنا أننا نستخدمها على DataRow

ماذا لو رغبنا في تغير أسعار جميع السلع بنسبة معينة نستطيع عمل ذلك عن طريق استخدام الاستعلام وتخزين النتائج في DataBase ونوضح ذلك بالمثال التالي :

 كود
Private Sub Button14_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button14.Click
Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")

DataGridView1.DataSource = Product.AsDataView

Dim productQuery = From row In Product.AsEnumerable _
Select row

DataGridView2.DataSource = productQuery.CopyToDataTable

For Each row In productQuery
row.SetField(Of Decimal)("List Price", CType(row.Field(Of Decimal)("List Price") + _
row.Field(Of Decimal)("List Price") * 0.25, Decimal))
Next

DataGridView3.DataSource = productQuery.CopyToDataTable

DataGridView4.DataSource = NORTHWNDDataSet.Products.GetChanges(DataRowState.Modified)

End Sub


في البداية قمت بتعريف DataTable وهو Product وهو نسخة من جدول Products الذي في DataSet وقمت بإظهار النتيجة في DataGridView1 وبعدها في الاستعلام productQuery وهو من نوع DataRow أنني قمت باختيار جميع السلع وإذا رغبنا في اختيار سلع حسب شرط معين فيمكن إضافتها في شرط بجملة Where وأظهرت نتيجة الاستعلام في DataGridView2.
وبعد ذلك عند تنفيذ الاستعلام في جملة For Each استخدمنا الأمر SetField على DataRow وحددنا الحقل وهو السعر ووضعت معدلة ان يزيد السعر بنسبة 25% وقمت بإظهار النتيجة في DataGridView3 ولاحظ هنا أن جميع الأسعار تغيرت وانعكست بشكل تلقائي في DataGridView1, DataGridView3
أي أنها تغيرت الأسعار في نتيجة الاستعلام وفي الجدول Product أيضا وانعكست أيضا على الجدول الأصلي في DataSet وهو Products ، ولكنها لم تتغير في DataGridView2 وذلك لانها نسخة (جدول جديد تم عمله بجملة CopyToDataTable) من نتيجة الاستعلام قبل اجراء التغيير على الأسعار.
وحتى أتأكد من إن تغيير الأسعار انعكس على DataSet قمت بإظهار التغيرات التي حصلت باستخدام الجملة Products.GetChanges في DataGridView4 .

ألان ماذا لو رغبت بتخزين أو حفظ (Save) التغير في ملف DataBase ، نعمل زر حفظ كما يلي :

 كود
Private Sub Save_Product(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button15.Click
Dim y As DialogResult = MsgBox("هل ترغب بالتخزين", MsgBoxStyle.YesNo)
If y = Windows.Forms.DialogResult.Yes Then

ProductsTableAdapter.Update(NORTHWNDDataSet.Products)

Me.NORTHWNDDataSet.AcceptChanges()

DataGridView4.DataSource = NORTHWNDDataSet.Products.GetChanges(DataRowState.Modified)
Else
NORTHWNDDataSet.Products.RejectChanges()
DataGridView4.DataSource = NORTHWNDDataSet.Products.GetChanges(DataRowState.Modified)
End If
End Sub


إذا ضغطنا على Yes نقوم بعمل Update في ProductsTableAdapter للجدول الأصلي حيث أن التغيرات قد انعكست عليه ثم نقوم بحفظها في AcceptChanges وبعد ذلك اكرر عملية إظهار التغيرات على الجدول الأصلي وهنا سنجد أن DataGridView4 لن تظهر أي سجلات وذلك يعني انه تم حفظ التغيرات.
أما لو قمت بالضغط على No فهنا أقوم بعمل إلغاء لجميع التغيرات بأمر RejectChanges على الجدول الاصلي Products وبعد ذلك اكرر عملية إظهار التغيرات على الجدول الأصلي وهنا سنجد أن DataGridView4 لن تظهر أي سجلات وذلك يعني انه تم ألغى جميع التغيرات ، وسنلاحظ أيضا وبشكل تلقائي أن النتائج في DataGridView1 قد انعكست عليه ولكنها لم تنعكس على DataGridView2, DataGridView3 لأنها نسخ من جدول الاستعلام قبل التعديل وبعد التعديل.


تحياتي للجميع
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالاثنين,14/فر/1430 هـ,08:32 صباحاً
المشاركة #7

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

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

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





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

LINQ Over Typed DataSet, Un-Typed DataSet, Table Adapters
الاستعلام عن طريق تعريف المصادر على أنها نوع محدد أو غير محدد من DataSet وتعبئة بيانات الجداول Tables عن طريق TableAdapter بشكل مباشر.



اولا : Un-Typed Dataset وهي الطريقة التي قمنا بشرحها في جميع الأمثلة السابقة .

والتي نقوم بها بتعريف متغير على انه جدول دون تحديد نوعه وكذلك نستخدم DataRow دون تحديد نوعه.

وكما في المثال التالي :
 كود

Me.ProductsTableAdapter.Fill(Me.NORTHWNDDataSet.Products)

Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")

Dim Prod1 = From o In Product.AsEnumerable _
Where o.Field(Of Integer)("Target Level") > 100 _
Order By o.Field(Of Integer)("ID"), o.Field(Of String)("Product Name") _
Select o

DataGridView1.DataSource = Prod1.AsDataView


فهنا تم تعريف الجدول Product As DataTable وانه يساوي Me.NORTHWNDDataSet.Tables("Products")
حتى نستطيع استخدامه في الاستعلام يجب تعريفه AsEnumerable ، وكذلك الاستعلام Prod1 يعتبر EnumberableRowCollection(Of Data.DataRow) ولم يتم تحديد نوع DataRow .
ولذلك كنا نستخدم Field ، Item و اسم الحقل بين " " في الاستعلام.
وكذلك يجب تعبئة ال Dataset ثم اخذ نسخة وتعبئتها في Product ، ونلاحظ هنا انه تم تعبئة البيانات في الذاكرة مرتين.

ثانيا : Typed DataSet وهي الطريقة الأسهل والأفضل والأسرع

وهذه الطريقة هي أن نقوم بإضافة DataSet من شاشة Data Source الذي ينتج عنه ملف NORTHWNDDataSet.xsd وفي هذه الحالة فانه يتم تعريف داخل ملف NORTHWNDDataSet.xsd وبشكل تلقائي TableAdapter لكل الجداول والتي تحتوي على جميع الحقول وخصائصها وهي تعتبر المخطط البياني schema ل DataSet فهنا نستطيع تطبيق الاستعلام عليها بكل سهولة ويسر وأكثر فعالية حيث أننا نستخدم أسماء الجداول وأسماء الحقول بشكل مباشر.
ونستطيع الحصول على البيانات دون تعبئة DataSet حيث نقوم بتعبئة DataTable الجداول بشكل مباشر من TableAdapter .

ونوضحها بالمثال التالي :

Un-Typed DataSet نعيد كتابة المثال السابق لبيان الفرق
 كود

Me.ProductsTableAdapter.Fill(Me.NORTHWNDDataSet.Products)

Dim Product As DataTable = Me.NORTHWNDDataSet.Tables("Products")

Dim Prod1 = From o In Product.AsEnumerable _
Where o.Field(Of Integer)("Target Level") > 100 _
Order By o.Field(Of Integer)("ID"), o.Field(Of String)("Product Name") _
Select o

DataGridView1.DataSource = Prod1.AsDataView


Typed DataSet

 كود

Dim TaProducts As New NORTHWNDDataSetTableAdapters.ProductsTableAdapter

Dim Product = TaProducts.GetData

Dim Prod1 = From o In Product _
Where Not (o.IsTarget_LevelNull) AndAlso o.Target_Level > 100 _
Order By o.ID, o.Product_Name _
Select o

DataGridView1.DataSource = Prod1.AsDataView


النتائج في المثالين هي نفسها ولكن هل يوجد فرق بين المثالين ؟ نعم يوجد فرق كبير جدا

في المثال الثاني عرفنا TaProduct أنها نسخة من schema ل ProductsTableAdapter NORTHWNDDataSetTableAdapters.ProductsTableAdapter وهي تحتوي على اسم الجدول وأسماء الحقول وخصائصها ومعرفة ضمن المخطط البياني.

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

في المثال الأول قمنا بتعبة DataSet في المثال الثاني لم نقم بتعبئة DataSet
في المثال الأول قمنا بتعريف Product As DataTable وقمنا بتعبئته من البيانات المعبئة في DataSet فهنا تم تحميلها مرتين في الذاكرة.

في المثال الثاني قمنا بتعريف Product ولم نحدد نوعه ولكن عند إسناد له القيمة من TaProducts.GetData فانه يأخذ نفس مواصفات وخصائص الجدول والحقول من ProductsTableAdapter ويكون نوعه ProductsDataTable ويقوم بتعبئة البيانات في Product ولاحظ هنا أننا عبئنا البيانات مرة واحدة فقط في الذاكرة.

في المثال الأول نوع الاستعلام Prod1 هو غير محدد النوع ولا نستطيع عمل الاستعلام إلا بعد تحويله إلى AsEnumerable وذلك لأنه خليط Collection غير محدد النوع
EnumberableRowCollection(Of Data.DataRow) أي انه غير محدد نوع DataRow

في المثال الثاني نوع الاستعلام Prod1 هو محدد النوع وهنا نستطيع عمل الاستعلام دون تحوله إلى AsEnumerable وذلك لأنه خليط Collection محدد النوع.
EnumberableRowCollection(Of NORTHWNDDataSet.ProductsRow)
أي انه محدد من نوع ProductsRow

في المثال الأول نستخدم أسماء الحقول فقط عن طريق Filed ,item ، اسم الحقل o!Name ولا نستطيع استخدام اسم الحقل بشكل مباشر.

أما في المثال الثاني نستخدم أسماء الحقول بشكل مباشر كما هي معرفة في ProductsTableAdapter
وهذا ما يجعل الاستعلام أكثر سهولة وفعالية واقل أخطاء من ناحية تحديد أسماء الحقول ويشبه إلى حد كبير طريقة استخدام الاستعلامات في SQL.

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

Dim MaxCost = Aggregate S In query Into Max(S.Standard_Cost)
Dim MinCost = Aggregate S In query Into Min(S.Standard_Cost)
Dim AvgCost = Aggregate S In query Into Average(S.Standard_Cost)
Dim SumCost = Aggregate S In query Into Sum(S.Standard_Cost)
Dim ConCost = Aggregate S In query Into Count(S.Standard_Cost)

MsgBox("Max Cost = " & MaxCost & Chr(13) & _
"Min Cost = " & MinCost & Chr(13) & _
"Avg Cost = " & AvgCost & Chr(13) & _
"Sum Cost = " & SumCost & Chr(13) & _
"Count Cost = " & ConCost)


وهنا نقوم بحساب (اكبر قيمة ، اقل قيمة ، المتوسط الحسابي ، المجموع ، العدد) من نتائج الاستعلام
وهنا يكون نوع المتغير S هو ProductsRow لان Query من نوع
EnumberableRowCollection(Of NORTHWNDDataSet.ProductsRow)
ونستخدم عندها اسم الحقل بشكل مباشر وذلك لأنه معرف في المخطط schema ل DataSet

ويمكن عمل أي تعديل أو إلغاء أو إضافة على بيانات الحقول وحفظها في ملف DataBase بكل سهولة ، وسارفق مثال كاملا على ذلك .


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


للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالخميس,24/فر/1430 هـ,09:38 صباحاً
المشاركة #8

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

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

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





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

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

 اقتباس
ويمكن عمل أي تعديل أو إلغاء أو إضافة على بيانات الحقول وحفظها في ملف DataBase بكل سهولة ، وسارفق مثال كاملا على ذلك


وهذا هو المثال في المرفقات مع ملف database

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


الملفات المرفقة
 LinqAddupdatedelete.rar ( 536.22ك ) عدد مرات التنزيل: 1124
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالخميس,02/ربيع الأول/1430 هـ,10:22 صباحاً
المشاركة #9

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

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

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





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


كيفية إظهار البيانات بطريقة on Typed DataSet Group join في Datagridview



هنا في هذه الحالة يجب أن نقوم بتخزين البيانات في متغير يكون له مفتاح وهو Group وباقي البيانات التي تندرج تحت هذا المفتاح وأفضل وأسهل طريقة لذلك هي استخدام dictionary

ولتوضيح الطريقة نبدأ بالمثال التالي :

نريد أن نقوم بعمل group join بين جدولين Product و Order_Details فهنا يكون المفتاح الرئيسي هو ProductRow والمعلومات الفرعية Order_DetailRows التي يكون فيها ID متساوي.
أولا يجب أن نقوم بتعريف متغير من نوع Dictionary ونعرف Key من نوع ProductsRow و المعلومات التي نرغب بتخزينها تحت هذا المفتاح سنعرفها على أنها خليط IEnumerable من نوع Order_DetailsRow وكما يلي :

 كود
Private GroupJoinDictionary As Dictionary(Of NORTHWNDDataSet.ProductsRow, IEnumerable(Of NORTHWNDDataSet.Order_DetailsRow))


بعد ذلك نقوم بتعريف متغيرات للجداول وتعبئة البيانات ومن ثم بناء الاستعلام

 كود
Private Sub Button23_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button23.Click

Dim TadProducts As New NORTHWNDDataSetTableAdapters.ProductsTableAdapter

Dim TadOrderDe As New NORTHWNDDataSetTableAdapters.Order_DetailsTableAdapter

Dim Product = TadProducts.GetData

Dim OrderDetail = TadOrderDe.GetData

DataGridView3.DataSource = Product.AsDataView

Dim Query = From Pro In Product _
Group Join Ord In OrderDetail On _
Pro.ID Equals Ord.Product_ID Into GPd = Group _
Where Not Pro.IsQuantity_Per_UnitNull _
Select Pro, GPd


نلاحظ هنا ان Query هو من نوع anonymous types وذلك لاننا قمنا بعمل Select للجدول الرئيسي Pro و ال Grp = Group وبهذه الحالة لا يمكن لنا اظهار البيانات في AsDataView لذلك نقوم بتصدير هذه البيانات Dictionary الذي قمنا بتعريفة في البداية وذلك عن طريق استخدام الامر ToDictionary

 كود
GroupJoinDictionary = Query.ToDictionary(Function(i) i.Pro, Function(y) y.GPd)


وهنا قمنا بوضع اسطر Product كمفتاح واسطر OrderDetail المتساوية في Id بينهما تحت هذا المفتاح

ولإظهار البيانات نقوم بعملها عن طريق BindingSource وذلك حتى نظهر البيانات لل Group عند التنقل في اسطر المفتاح الرئيسي

 كود
Me.BindingSource1.DataSource = GroupJoinDictionary.Keys

DataGridView1.DataSource = BindingSource1


نقوم هنا باظهار بيانات المفتاح الرئيسي GroupJoinDictionary.Keys وهي جميع حقول ProductRow

 كود
DataGridView2.DataSource = BindingSource2


ثم نقوم بإظهار بيانات لل Group

 كود
End Sub


وهنا يجب أن نقوم بتعبئة البيانات لل Group في حدث BindingSource1_CurrentChanged وذلك حتى يظهر البيانات المخزنة تحت ذلك المفتاح

 كود
Private Sub BindingSource1_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BindingSource1.CurrentChanged

Try
Me.BindingSource2.DataSource = GroupJoinDictionary(CType(BindingSource1.Current, NORTHWNDDataSet.ProductsRow)).CopyToDataTable
Catch ex As Exception
Me.BindingSource2.DataSource = Nothing
End Try
End Sub


وهنا نقوم بتحويل بيانات السطر الذي نقف علية BindingSource1.Current الى نوع ProductsRow وهو المفتاح حتى نظهر البيانات المخزنة تحت ذلك المفتاح وفي حالة انه لا يوجد بيانات تحت ذلك المفتاح لا نظهر أية بيانات.



كيفية إظهار البيانات بطريقة on Typed DataSet Group By في Datagridview



وهي نفس الطريقة السابقة ولكن هنا نستخدم جدول واحد فقط Order_DetailsRow وهنا نحدد المفتاح برقم IDProduct أولا يجب أن نقوم بتعريف متغير من نوع Dictionary ونعرف Key من نوع Integer و المعلومات التي نرغب بتخزينها تحت هذا المفتاح سنعرفها على أنها خليط IEnumerable من نوع Order_DetailsRow وكما يلي :

 كود
Private GroupbyDictionary As Dictionary(Of Integer, IEnumerable(Of NORTHWNDDataSet.Order_DetailsRow))


بعد ذلك نقوم بتعريف متغيرات للجداول وتعبئة البيانات ومن ثم بناء الاستعلام

 كود
Private Sub Button25_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button25.Click

Dim TadProducts As New NORTHWNDDataSetTableAdapters.ProductsTableAdapter

Dim TadOrderDe As New NORTHWNDDataSetTableAdapters.Order_DetailsTableAdapter

Dim Product = TadProducts.GetData

Dim OrderDetail = TadOrderDe.GetData

DataGridView3.DataSource = Product.AsDataView

Dim Query = From Det In OrderDetail _
Group Det By key = Det.Product_ID Into Group _
Select key, Group

GroupbyDictionary = Query.ToDictionary(Function(i) i.key, Function(y) y.Group)

Me.BindingSource3.DataSource = Product

Me.ComboBox1.DataSource = GroupbyDictionary.Keys.ToList

DataGridView1.DataSource = BindingSource3

DataGridView2.DataSource = BindingSource4

End Sub


نلاحظ هنا ان Query هو من نوع anonymous types وذلك لأننا قمنا بعمل Select للجدول الرئيسي Key و ال Group وبهذه الحالة لا يمكن لنا إظهار البيانات في AsDataView لذلك نقوم بتصدير هذه البيانات Dictionary الذي قمنا بتعريفة في البداية وذلك عن طريق استخدام الأمر ToDictionary

وبعدها أقوم بإظهار بيانات جدول Product في Datagridview عن طريق BindingSource3 وسنقوم بإظهار البيانات التي تحت ال Group بطريقتين لتوضيح كيفية الاستفادة من هذه الطريقة
نقوم بتخزين المفاتيح في Combobox والتي تساوي GroupbyDictionary.Keys.ToList ولاظهار البيانات التي تحت ال group يجب علينا عمل اجرائين للاحداث BindingSource3_CurrentChanged عند التنقل في الجدول الرئيسي و ComboBox1_SelectedValueChanged عند الاختيار من ال Combo


 كود
Private Sub BindingSource3_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BindingSource3.CurrentChanged
Try
Dim row As DataRowView = BindingSource3.Current
Dim ky = row.Item("ID")

Me.BindingSource4.DataSource = GroupbyDictionary(ky).CopyToDataTable
Catch ex As Exception
Me.BindingSource4.DataSource = Nothing
End Try
End Sub


هنا نقوم بأخذ رقم المفتاح Id من السطر الذي نقف علية ومن ثم نظهر البيانات GroupbyDictionary(ky).CopyToDataTable لذلك المفتاح

 كود
Private Sub ComboBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedValueChanged

Try
Dim k1 = CType(ComboBox1.Text, Integer)
Me.BindingSource4.DataSource = GroupbyDictionary(k1).CopyToDataTable
Catch ex As Exception
Me.BindingSource4.DataSource = Nothing
End Try
End Sub


هنا نقوم بأخذ رقم المفتاح Id من ال Combo ومن ثم نظهر البيانات GroupbyDictionary(k1).CopyToDataTable لذلك المفتاح




كيفية تجميع البيانات حسب فئة وإظهارها في Datagridview
بطريقة on Typed DataSet ToLookup



لو أردنا تجميع البيانات في جدول معين حسب فئة معينة وإظهار هذه الفئات في DataGridview وإظهار باقي البيانات حسب هذه الفئة في DataGridView أخر. مثلا في جدول Product يوجد به حقل التصنيف للمادة وهو Category فلو اردنا عمل استعلام نقوم بتجميل ال ProductRow كل حسب فئته

فهنا نستخدم الأمر ToLookup الذي يقوم بعمل تصنيف للفئات وهي تقريبا مشابهه للطريقة ToDictionary

نقوم بعمل متغير لحفظ الفئات والحقول التابعة لتلك الفئة وهنا نحدد المفتاح به من نوع Object

 كود
Private productsLookup As ILookup(Of Object, NORTHWNDDataSet.ProductsRow)


بعد ذلك نقوم بتعريف متغيرات للجداول وتعبئة البيانات ومن ثم بناء الاستعلام

 كود
Private Sub Button26_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button26.Click
Dim TadProducts As New NORTHWNDDataSetTableAdapters.ProductsTableAdapter

Dim Product = TadProducts.GetData

productsLookup = Product.ToLookup(Function(p) p("Category"))

Me.BindingSource5.DataSource = productsLookup.ToList()

DataGridView1.DataSource = BindingSource5

End Sub


وهنا نقوم بتحديد الفئة التي نرغب بترتيب الحقول حسبها Product.ToLookup(Function(p) p("Category")) ونقوم بإظهار الفئات في DataGridView1 عن طريق BindingSource5 ولإظهار البيانات تحت تلك الفئة نضعها بالإجراء BindingSource5_CurrentChanged

 كود
Private Sub BindingSource5_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BindingSource5.CurrentChanged
Try

Dim row = BindingSource5.Current

Dim confections = productsLookup(row.Key)

DataGridView2.DataSource = confections.CopyToDataTable
Catch ex As Exception
Me.BindingSource4.DataSource = Nothing
MsgBox(ex.Message)
End Try
End Sub


وللحصول على الفئة نقوم بتعريف Row ولا نحدد نوعه لأنه من نوع ILookUp ولأننا عرفنا المفتاح على انه Object ، وللحصول على الحقول المخزنة تحت تلك الفئة نقوم بتعريف متغير وسيكون نوعه خليط من NORTHWNDDataSet.ProductsRow ونقوم بإظهارها في datagridview2




كيفية تجميع البيانات من عدة جداول وإظهارها في Datagridview واحدة
بطريقة Typed DataSet



ماذا لو رغبنا بعمل DataGridView نظهر فيها حقول معينة من عدة جدول ونوضحها بالمثال التالي

أولا يجب تعبئة DataSet لجميع الجداول التي سوف استخدمها وعددها خمسة جداول

 كود
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.EmployeesTableAdapter.Fill(Me.NORTHWNDDataSet.Employees)

Me.CustomersTableAdapter.Fill(Me.NORTHWNDDataSet.Customers)

Me.OrdersTableAdapter.Fill(Me.NORTHWNDDataSet.Orders)

Me.Order_DetailsTableAdapter.Fill(Me.NORTHWNDDataSet.Order_Details)

Me.ProductsTableAdapter.Fill(Me.NORTHWNDDataSet.Products)

End Sub



بعد ذلك نعرف متغير ds وهو نسخة من NORTHWNDDataSet وبعدها نقوم ببناء الاستعلام ، وبما انه يوجد علاقة بين الجداول في Dataset فهنا نستطيع استخدام هذه الخاصية حيث انه في Typed DataSet وعندما تكون العلاقة 1 إلى كثير فيكون Rows للجدول الفرعي ضمن حقول الجدول الرئيسي.
فهنا سأقوم بعمل الاستعلام على ثلاثة جداول فقط ولكن سآخذ الحقول من الخمسة جداول وذلك عن طريق وضع شرط معين يربط هذه الجداول مع بعضها حسب قيمة حقل العلاقة بينهم.
ونلاحظ هنا أن Product ليست مربوطة مع Orders أو مع Employees أو مع Customer ولذلك استخدما الجدول orderDetails الذي هو مربوط مع Product ومربوط مع Orders كجدول وسيط للحصول على البيانات التي ارغب بها ولكني أن استخدم حقوله.


 كود
Private Sub Button24_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button24.Click

Dim ds As New NORTHWNDDataSet
ds = NORTHWNDDataSet

Dim query = (From orders In ds.Orders _
From orderDetails In ds.Order_Details _
From prods In ds.Products _
Where ( _
(orderDetails.Order_ID = orders.Order_ID) And _
(prods.ID = orderDetails.Product_ID) And _
(orders.Employee_ID = 1) _
  _
Order By (orders.Ship_City) _
Select CustomerOrderResult = New With { _
.CustomerID = orders.Customer_ID, _
.CustomerContactName = orders.CustomersRow.First_Name, _
.CustomerCountry = orders.CustomersRow.City, _
.OrderDate = orders.Order_Date, _
.EmployeeID = orders.EmployeesRow.ID, _
.EmployeeFirstName = orders.EmployeesRow.First_Name, _
.EmployeeLastName = orders.EmployeesRow.Last_Name, _
.ProductName = prods.Product_Name _
}).ToList

DataGridView1.DataSource = query
End Sub


وهنا سيكون الاستعلام query من نوع List(of anonymous types) والذي نستطيع تحويله إلى جدول عن طريق استخدام الأمر query.CopyToDataTableCustom









وهكذا

وبحمد الله والصلاة والسلام

على سيدنا محمد صلى الله علية وسلام

قد اكتملت هذه الدورة



المراجع :

http://msdn.microsoft.com/en-us/library/bb386977.aspx

وهذا رابط لأمثلة LINQ to DataSet Examples

http://msdn.microsoft.com/en-us/library/bb399401.aspx

وهذا رابط لأمثله LINQ to DataSet 101 Samples على جميع Standard Query Operators

http://msdn.microsoft.com/en-us/vbasic/bb688086.aspx

والى اللقاء مع الدورة

القادمة في الأوامر الجديدة في

Visual Basic 2008





1- Extension Methods


وهي طريقة إضافة (توسع ، امتداد ، تغيير) وظائف وأوامر إلى أنواع البيانات وال Control المعرفة أصلا في Vb.Net دون اشتقاق Without Creating A New Derived Type وممكن أن تكون إجراء Sub أو function.


2- Partial Methods
3- DataRepeate
4- Func
5- Local Type Inference
6- If Operator
7- Nullable Value Types
8- PrintForm Component
9- Printer Compatibility Library




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

للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
zedanco
مشاركةالأربعاء,25/ربيع الأول/1431 هـ,02:44 صباحاً
المشاركة #10
موضوع هايل جد مزيلا من الشكر
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة

    

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

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



 
الوقت الأن:اليوم,01:25 صباحاً بتوقيت القدس المحتلة

Powered By arabmoheet v3.1

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