الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مقدمة إلى Linq في فيجول بايزيك

بدأه محمد سامر أبو سلو في 30 نوفمبر 2007 · 18 رد · 7,409 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تضيف Linq إمكانيات استعلامية لفيجول بايزيك وتقدم إمكانيات بسيطة وقوية عندما تتعامل مع العديد من أنواع البيانات إضافة إلى إرسال الاستعلام إلى قاعدة بيانات كي تتم معالجته أو العمل مع صيغة مختلفة للاستعلام لكل نوع من أنواع البيانات التي تقوم بالبحث عنها. حيث تقدم Linq الاستعلامات كجزء من لغة فيجول بايزيك مستخدمة صيغة موحدة بغض النظر عن نوع البيانات الذي تستخدمه. كما أنها تمكنك من الاستعلام عن البيانات من قاعدة بيانات SQL Server أو Xml أو المجموعات والمصفوفات في الذاكرة أو ADO .net Datasets أو أي مصدر بيانات محلي أو بعيد يدعم Linq حيث يمكنك عمل ذلك كله باستخدام عناصر لغة فيجول بايزيك الشائعة لأن استعلاماتك أصبحت مكتوبة بلغة فيجول بايزيك ونتائج الاستعلام تعاد كأغراض أنواع بيانات قوية داعمة IntelliSense مما يجعل كتابتك للكود أسرع واكتشافك للأخطاء في الاستعلامات عند ترجمة المشروع بدلا من وقت التنفيذ كما أن استعلامات Linq يمكن أن تكون مصدرا لاستعلامات إضافية لمزيد من الدقة في البحث. كما يمكن ربطها مع التحكمات ممكنا المستخدم من استعراض وتعديل نتائج استعلامك بسهولة. فمثلا يظهر الكود التالي استعلام Linq يعيد قائمة Customers من مجموعة ويقوم بتجميعهم حسب الموقع

Dim customers As List(Of Customer) = GetCustomerList()

Dim customersByCountry = From cust In customers _
						 Order By cust.Country, cust.City _
						 Group By CountryName = cust.Country _
						 Into RegionalCustomers = Group, Count() _
						 Order By CountryName

For Each country In customersByCountry
  Console.WriteLine(country.CountryName & _
					" (" & country.Count & ")" & vbCrLf)

  For Each customer In country.RegionalCustomers
	Console.WriteLine(vbTab & customer.CompanyName & _
					  " (" & customer.City & ")")
  Next
Next

مزودات Linq - LINQ Providers

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

• Linq to Objects يمكنك هذا المزود من الاستعلام في المجموعات والمصفوفات في الذاكرة إذا كانت غرضك يدعم الواجهة IEnumerable أو الواجهة IEnumerable(T) بحيث يمكنك المزود من الاستعلام عنها ويمكنك تمكين هذا المزود باستيراد المجال System.Linq والذي يكون مستوردا بشكل افتراضي في مشاريع فيجول بايزيك

• Linq to SQL يمكنك هذا المزود من الاستعلام من قواعد بيانات SQL Server والتحديث إليها ويجعل من السهل ربط أغراض التطبيق مع الجداول والأغراض في قواعد البيانات. ويسهل فيجول بايزيك العمل مع Linq to SQL بتقديم Object Relational Designer والذي يمكنك من إنشاء Object Model في التطبيق يرتبط مع الأغراض في قاعدة البيانات ويقدم الـ O/R Designer إمكانية التعامل مع الإجراءات والوظائف المخزنة وإجراءات الغرض DataContext الذي يدير الاتصال مع قاعدة البيانات ويخزن الحالة من أجل تصادم البيانات التفاؤلي

• Linq to Xml يمكنك من الاستعلام من Xml والتعديل عليها بحيث يمكنك تعديل محتويات Xml الموجودة في الذاكرة أو يمكنك تحميل ملف Xml أو حفظه

• Linq to Dataset يمكنك من الاستعلام من ADO .net Datasets والتعديل عليها وإضافة قوة Linq للتطبيقات التي تستخدم Datasets تسهل وتوسع إمكانيات الاستعلام والتجميع والتحديث في الـ Dataset في تطبيقك

بنية استعلام Linq - The Structure of a LINQ Query

يشار عادة إلى استعلام Linq بتعبير الاستعلام وهو يتألف من توليفة من تراكيب الاستعلام التي تحدد مصدر البيانات ومتغيرات التكرار الخاصة بالاستعلام كما يمكنه أن يتضمن تعليمات من أجل الفرز أو التصفية أو التجميع أو الضم أو الحساب ليتم تطبيقها على البيانات المصدرية وصيغتها تكون مشابهة لصيغة الـ SQL ولهذا ستجد أن معظم الصيغة مألوفة.

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

Dim queryResults = From cust In customers _
				   Select cust.CompanyName

وهذا المثال يشكل استعلام مقبول بذات نفسه ومع ذلك يصبح الاستعلام أقوى عندما تضيف أقسام استعلام أخرى لتحديد النتائج فمثلا يمكنك إضافة قسم Where لتصفية النتائج إلى قيمة أو أكثر وتكون تعابير الاستعلام عبارة عن سطر واحد من الكود بحيث يمكنك إضافة أقسام استعلام جديدة لنهاية الاستعلام كما يمكنك فصل الاستعلام إلى عدة أسطر لتحسين قراءة كودك باستخدام المحرف _ ويمثل الكود التالي استعلاما يستخدم قسم Where

Dim queryResults = From cust In customers _
				   Where cust.Country = "USA"

ويمثل قسم select قسم قوي آخر في الاستعلام حيث يمكنك من إعادة الحقول المختارة فقط من مصدر البيانات وتعيد استعلامات Linq مجموعة تعدادية من الأغراض القوية النوع كما يمكنها إعادة أنواع مجهولة أو أنواع معروفة. ويمكن استخدام قسم select للعودة بحقل واحد فقط من مصدر البيانات وعندما تفعل هذا يكون نوع المجموعة المعادة هو نوع بيانات ذلك الحقل. وعندما يعيد قسم Select مجموعة من الحقول من مصدر البيانات تكون المجموعة المعادة من النوع المجهول ويمكنك مطابقة الحقول المعادة من الاستعلام مع حقول من نوع معروف محدد ويظهر الكود التالي تعبير استعلام يعيد مجموعة نوعها مجهول تضم أرقاما مع بيانات من الحقل المحدد من مصدر البيانات

Dim queryResults = From cust In customers _
				   Where cust.Country = "USA" _
				   Select cust.CompanyName, cust.Country

يمكن استخدام استعلامات Linq لدمج عدة مصادر من البيانات في نتيجة واحدة حيث يمكن عمل هذا باستخدام قسم From واحد أو أكثر أو باستخدام أقسام Join أو Group Join ويظهر الكود التالي تعبير استعلام يضم بيانات Customer و Order ويعيد مجموعة من نوع مجهول تحتوي بيانات من Customer و Order

Dim queryResults = From cust In customers, ord In orders _
				   Where cust.CustomerID = ord.CustomerID _
				   Select cust, ord

يمكنك استخدام قسم Group Join لبناء استعلامات شجرية تحتوي مجموعة من أغراض Customer وكل غرض Customer يمتلك خاصية تحتوي مجموعة تتضمن جميع أغراض order لذلك الزبون. ويظهر المثال التالي تعبير استعلام يدمج بيانات Customer و Order كنتيجة شجرية ويعيد مجموعة من نوع مجهول ويعيد الاستعلام نوعا يتضمن الخاصية CustomerOrders تحتوي على مجموعة تحتوي على مجموعة من بيانات Order وبيانات Customer وتتضمن أيضا الخاصية OrderTotal تحتوي على مجموع إجمالي الطلبات لذلك الزبون

Dim queryResults = From cust In customers _
				   Group Join ord In orders On _
				   cust.CustomerID Equals ord.CustomerID _
				   Into CustomerOrders = Group, _
						OrderTotal = Sum(ord.Total) _
				   Select cust.CompanyName, cust.CustomerID, _
						  CustomerOrders, OrderTotal

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

معاملات استعلام Linq - Visual Basic LINQ Query Operators

تتضمن الفئات في المجال System.Linq والمجالات التي تدعم Linq طرائق يمكنك استدعاؤها لإنشاء الاستعلامات وتوليها بحسب حاجة التطبيق ويتضمن فيجول بايزيك كلمات مفتاحية لأقسام الاستعلام الشائعة

From Clause

يجب أن يبدأ الاستعلام بقسم From أو Aggregate ويحدد قسم From المجموعة المصدر أو متغير التكرار للاستعلام

' Returns the company name for all customers for whom
' State is equal to "WA".
Dim names = From cust In customers _
			Where cust.State = "WA" _
			Select cust.CompanyName

Select Clause

اختياري يحدد مجموعة من متغيرات التكرار للاستعلام

' Returns the company name and ID value for each
' customer as a collection of a new anonymous type.
Dim customerList = From cust In customers _
				   Select cust.CompanyName, cust.ID

و إن لم يكن قسم Select موجودا في الاستعلام فتتألف متغيرات التكرار للاستعلام من تلك المحددة في قسم From أو Aggregate

Where Clause

اختياري ويحدد شرط التصفية للاستعلام

' Returns all product names for which the Category of
' the product is "Beverages".
Dim names = From product In products _
			Where product.Category = "Beverages" _
			Select product.Name

Order By Clause

اختياري ويحدد ترتيب الفرز للأعمدة في الاستعلام

' Returns a list of books sorted by price in 
' ascending order.
Dim titlesAscendingPrice = From b In Books _
						   Order By b.Price

Join Clause

اختياري ويدمج مجموعتين ضمن مجموعة واحدة

' Returns a list of books sorted by price in 
' ascending order.
Dim titlesAscendingPrice = From b In Books _
						   Order By b.Price

Group by Clause

اختياري ويقوم بتجميع عناصر نتيجة الاستعلام ويمكن استعماله لتطبيق إجراءات تجميع لكل مجموعة

' Returns a list of orders grouped by the order date
' and sorted in ascending order by the order date.
Dim orders = From order In orderList _
			 Order By order.OrderDate _
			 Group By OrderDate = order.OrderDate _
			 Into OrdersByDate = Group

Group Join Clause

اختياري ويجمع مجموعتين ضمن مجموعة شجرية واحدة

' Returns a combined collection of customers and
' customer orders.
Dim customerList = From cust In customers _
				   Group Join ord In orders On _
				   cust.CustomerID Equals ord.CustomerID _
				   Into CustomerOrders = Group, _
						OrderTotal = Sum(ord.Total) _
				   Select cust.CompanyName, cust.CustomerID, _
						  CustomerOrders, OrderTotal

Aggregate Clause

يجب بدء الاستعلام دوما إما بقسم From أو قسم Aggregate وقسم Aggregate يطبق واحدة أو أكثر من وظائف التجميع على المجموعة فمثلا يمكن استخدام قسم Aggregate لحساب مجموع جميع العناصر المعادة بالاستعلام

' Returns the sum of all order totals.
Dim orderTotal = Aggregate order In Orders _ 
				 Into Sum(order.Total)

كما يمكنك استخدام قسم Aggregate لتعديل الاستعلام فمثلا يمكن استخدام قسم Aggregate لإجراء عملية حسابية على مجموعة استعلام

' Returns the customer company name and largest 
' order total for each customer.
Dim customerMax = From cust In customers _
				  Aggregate order In cust.Orders _
				  Into MaxOrder = Max(order.Total) _
				  Select cust.CompanyName, MaxOrder
1

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

Let Clause

اختياري ويقوم بحساب قيمة ويضعها في متغير جديد

' Returns a list of products with a calculation of
' a ten percent discount.
Dim discountedProducts = From prod In products _
						 Let Discount = prod.UnitPrice * 0.1 _
						 Where Discount >= 50 _
						 Select prod.ProductName, prod.UnitPrice, Discount

Distinct Clause

اختياري وهو يضبط القيم المعادة من الاستعلام بحيث لا يجلب قيما مكررة

' Returns a list of cities with no duplicate entries.
Dim cities = From item In Customers _
			 Select customer.City_
			 Distinct

Skip Clause

اختياري يتجاوز عددا معينا من العناصر في المجموعة ويعيد الباقي

' Returns a list of customers. The first 10 customers
' are ignored and the remaining customers are
' returned.
Dim customerList = From cust In customers _
				   Skip 10

Skip While Clause

اختياري يتجاوز عناصر المجموعة طالما قيمة الشرط True ثم يعيد باقي العناصر

' Returns a list of customers. The query ignores all
' customers until the first customer for whom
' IsSubscriber returns false. That customer and all
' remaining customers are returned.
Dim customerList = From cust In customers _
				   Skip While IsSubscriber(cust)

Take Clause

اختياري ويعيد عددا من العناصر المتجاورة في بداية المجموعة

' Returns the first 10 customers.
Dim customerList = From cust In customers _
				   Take 10

Take While Clause

اختياري يقوم بتضمين عناصر المجموعة طالما قيمة الشرط True ويتجاهل بقية العناصر

' Returns a list of customers. The query returns
' customers until the first customer for whom 
' HasOrders returns false. That customer and all 
' remaining customers are ignored.
Dim customersWithOrders = From cust In customers _
						  Order By cust.Orders.Count Descending _
						  Take While HasOrders(cust)

كما يمكنك استخدام خصائص إضافية لاستعلام Linq باستدعاء عناصر المجموعات والأنواع المستعلم عنها التي يوفرها Linq حيث يمكنك استخدام هذه الإمكانيات الإضافية باستدعاء معامل استعلام على نتيجة الاستعلام فمثلا الكود التالي يستخدم الطريقة Union لدمج ناتج استعلامين في نتيجة استعلام واحدة ويستخدم الطريقة ToList(TSource) لإعادة ناتج الاستعلام كقائمة

Public Function GetAllCustomers() As List(Of Customer)
	Dim customers1 = From cust In domesticCustomers
	Dim customers2 = From cust In internationalCustomers

	Dim customerList = customers1.Union(customers2)

	Return customerList.ToList()
End Function

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#4

جزاك الله خيراً على هذا المجهود الرائع

استاذنا القدير نريد فى نقاط مختصرة اهم الجديد فى فيجول بيسك 2008

وجعلة الله فى ميزان حسناتك

#5

من فوائد Linq أثناء التجربة فعليا اختصار كتابة الكود وسأورد مثالا واحد من الأمثلة التي قمت بتجريبها

لدي في أحد المشاريع الكود التالي

	Private Sub GetWorkingDate()
		Try
			Using Mocon As New SqlConnection(My.Settings.AccountsConnectionString)
				Dim MoCmd As New SqlCommand
				Dim MoReader As SqlDataReader

				MoCmd.CommandText = "SELECT MAX(WorkingDate) As WoDate From WorkingDate"
				MoCmd.CommandType = CommandType.Text
				MoCmd.Connection = Mocon
				MoCmd.Connection.Open()

				MoReader = MoCmd.ExecuteReader

				If MoReader.HasRows = True Then
					While MoReader.Read
						If IsDate(MoReader.Item("WoDate")) = True Then
							Me.WorkingDateLbl.Text = Format(MoReader.Item("WoDate"), "dd/MM/yyyy")
						Else
							Me.WorkingDateLbl.Text = Now.ToString("dd/MM/yyyy")
						End If
					End While
				Else
					Me.WorkingDateLbl.Text = Now.ToString("dd/MM/yyyy")
				End If
				MoCmd.Connection.Close()

				SaveWorkingDate()
			End Using

		Catch ex As Exception
			MsgBox(ex.Message)

		End Try
	End Sub

لاحظ كيف تقلص حجم الإجراء وبقي يعمل بشكل ممتاز عند إعادة كتابته بواسطة Linq

   Private Sub GetWorkingDateLinq()
		Try
			Dim ads As New AccountsDataSet
			Dim Wdta As New WorkingDateTableAdapter
			Wdta.ClearBeforeFill = True
			Wdta.Fill(ads.WorkingDate)

			Dim Wod = Aggregate Wdt In ads.WorkingDate _
					  Into Mdt = Max(Wdt.WorkingDate)

			Me.WorkingDateLbl.Text = Wod.ToString("dd/MM/yyyy")

		Catch ex As Exception
			Me.WorkingDateLbl.Text = Now.ToString("dd/MM/yyyy")
		End Try

		Me.SaveWorkingDate()
	End Sub

ولو كانت الـ Form التي أعمل عليها تحوي الـ Dataset و الـ TableAdapter سلفا لتقلص حجم الكود أكثر

   Private Sub GetWorkingDateLinq()
		Try
			Dim Wod = Aggregate Wdt In ads.WorkingDate _
					  Into Mdt = Max(Wdt.WorkingDate)

			Me.WorkingDateLbl.Text = Wod.ToString("dd/MM/yyyy")

		Catch ex As Exception
			Me.WorkingDateLbl.Text = Now.ToString("dd/MM/yyyy")
		End Try

		Me.SaveWorkingDate()
	End Sub

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 10 يناير 2008 في 17:14

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6

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

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

لوكنت وغلاً في الرجال لضرني**** حسن جرائتي ومقتدي

منتديات طريق الهداية

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

- أعتقد ان الشرح هنا كافي ويوضح المطلوب بالكامل حتى تستطيع عمل أي استعلام تريده كما أنصحك بقراءة موضوعي ترقية مشاريع 2005 لتعمل على 2008 ثم إضافة دعم Linq لتلك المشاريع فسيساعدك في التعرف على كيفية الاستعلام

- على كل حال كل ما تحتاجه هو داتا سيت مليئة بالبيانات ثم تقوم بالاستعلام منها مباشرة

فإن كان لدي داتاسيت باسم Accds تمثل قاعدة بيانات خاصة بالحسابات وفيها جدول باسم AccountMovements يتم تسجيل حركات الحسابات فيه فيمكنني استخدام الاستعلام التالي للحصول على قائمة بحركات الحساب

		Dim AccMov = From AccBal In Accds.AccountMovements _
					 Where AccBal.AccountNumber Like (AccNum & "*") _
					 Select AccBal

وإن أردت رصيد الحساب يمكنني الاستعلام من نتائج الاستعلام السابق باستخدانم الدالات التجميعية Aggregate

 Dim TempBal = Aggregate AccBa In AccMov _
					Into Bal = Sum(AccBa.DebitAmmount - AccBa.CreditAmmount)

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 26 يناير 2008 في 18:37

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#8

مثال آخر لدي داتا سيت تحتوي على بيانات حسابات مسماة AccountsDataSet وفيها جدول باسم Accounts يحتوي على قائمة بالحسابات الخاصة بالبرنامج فإن أردت قائمة بالحسابات الرئيسية فقط يمكنني استخدام الاستعلام التالي للحصول على تلك القائمة

   Private Sub FillParentAccountsListLinq()
		Me.ParentAccountComboBox.Items.Clear()
		AccountNames.Clear()
		Me.ParentAccountComboBox.Items.Add("0")
		AccountNames.Add("No Parent", "0")

		Dim ParentList = From ParLst In AccountsDataSet.Accounts _
				  Where ParLst.IsChildAccount = False _
				  Order By ParLst.AccountNumber _
				  Select ParLst

		For Each Plst In ParentList
			Me.ParentAccountComboBox.Items.Add(Plst.AccountNumber)
			AccountNames.Add(Plst.AccountName, Plst.AccountNumber)
		Next
	End Sub

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

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 26 يناير 2008 في 18:43

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#9

مشكور يا مشرفنا الفاضل ولكن لدي استفسار بسيط

الان بالنسبة لمتغير مثل ParLst هل يجب تعريف متغير من نوع معين ام فقط نضع هنا اي متغير ومانوعه وشكرا

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

لوكنت وغلاً في الرجال لضرني**** حسن جرائتي ومقتدي

منتديات طريق الهداية

#10

بالمختصر المفيد اخترع أي اسم متغير من عندك واستخدمه بدون أي تعريف وستلاحظ انه سيعمل - فكرة غريبة ولكنها تعمل هنا -

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

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 27 يناير 2008 في 01:10

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#11

مع أنه غير ضروري والشرح واضح جدا هذا مثال عن برنامج يستخدم Linq to Dataset من هنا TestLinqToDataset.zip

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#12

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

	Private Sub MovNameBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MovNameBtn.Click
		' Get Account Movements from ACCOUNTS_MOVEMENTS Table
		' And The Acoount Name from ACCOUNTS Table
		Dim MovNam = From Acc In SampleDatabaseDataSet.ACCOUNTS _
					 Join Mov In SampleDatabaseDataSet.ACCOUNTS_MOVEMENTS _
					 On Acc.ACC_NUMBER Equals Mov.ACC_NUMBER _
					 Select Mov.MOVMENT_DATE, Mov.ACC_NUMBER, Acc.ACC_NAME, Mov.DEBIT_AMOUNT, Mov.CREDIT_AMOUNT

		Me.DataGridView1.DataSource = MovNam.ToList

	End Sub

	Private Sub AccountBalancesBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AccountBalancesBtn.Click
		' Get The Balnce and The Account Number And Account Name
		Dim MovNam = From Acc In SampleDatabaseDataSet.ACCOUNTS _
					 Join Mov In SampleDatabaseDataSet.ACCOUNTS_MOVEMENTS _
					 On Acc.ACC_NUMBER Equals Mov.ACC_NUMBER _
					 Select Mov.MOVMENT_DATE, Mov.ACC_NUMBER, Acc.ACC_NAME, Mov.DEBIT_AMOUNT, Mov.CREDIT_AMOUNT

		Dim AccBal = From AcBa In MovNam _
					 Group By acc_number = AcBa.ACC_NUMBER _
					 Into Balance = Sum(AcBa.DEBIT_AMOUNT - AcBa.CREDIT_AMOUNT)


		Dim AccBalName = From ab In AccBal Join ac In SampleDatabaseDataSet.ACCOUNTS _
						 On ab.acc_number Equals ac.ACC_NUMBER _
						 Select ab.acc_number, ac.ACC_NAME, ab.Balance


		Me.DataGridView1.DataSource = AccBalName.ToList
	End Sub

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#13

وهذا أيضا مثال لاستعلام من أكثر من جدول

لاحظ كيف يمكننا تعشيش الاستعلامات كما نشاء للحصول على أي نتيجة نريدها

وهذا الكود أيضا يعتمد على المثال المرفق سابقا

	Private Sub ParenAccBal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ParenAccBal.Click
		Dim AccList = From Acclst In SampleDatabaseDataSet.ACCOUNTS _
					  Where Acclst.IS_CHILD_ACCOUNT = False _
					  Order By Acclst.ACC_NUMBER _
					  Select Acclst.ACC_NUMBER, Acclst.ACC_NAME, Acclst.IS_CHILD_ACCOUNT

		Dim ParAccMov = From PaAcLi In SampleDatabaseDataSet.ACCOUNTS_MOVEMENTS, Acl In AccList _
						Where PaAcLi.ACC_NUMBER Like Acl.ACC_NUMBER & "*" _
						Select Acl.ACC_NUMBER, PaAcLi.MOVMENT_DATE, PaAcLi.DEBIT_AMOUNT, PaAcLi.CREDIT_AMOUNT


		Dim AccBal = From AcBa In ParAccMov _
					 Group By acc_number = AcBa.ACC_NUMBER _
					 Into Balance = Sum(AcBa.DEBIT_AMOUNT - AcBa.CREDIT_AMOUNT)


		Dim AccBalName = From ab In AccBal Join ac In SampleDatabaseDataSet.ACCOUNTS _
				 On ab.acc_number Equals ac.ACC_NUMBER _
				 Order By ab.acc_number _
				 Select ab.acc_number, ac.ACC_NAME, ab.Balance


		Me.DataGridView1.DataSource = AccBalName.ToList

	End Sub

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 1 فبراير 2008 في 23:40

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#14

أخي الفاضل محمد سامر أبو سلو

جزاك الله خيراً على هذا الشرح .

أنا لي سؤال

أريد أن أستعلم عن اسم معين و ليكن مثلاً في دليل الهاتف فسيكون كود الاستعلام كالآتي:

Dim Contact = From Con In dtSet.tblContacts _                                         Where Con.First_Name Like Trim(txtName.Text)                                        Select Con.First_Name , Con.Last_Name

dtGrid.DataSource = Contact.ToList()

و بفرض أن txtName.Text = ahmad و الاسم في قاعدة البيانات Ahmad

و مع ذلك لا يتم الرجوع بقيمة إلا إذا كتب كما هي

و إذا أضفت "*" فيوجد أيضاً حساسية لحالة الحرف

السؤال الاخير:

ما هو الكود البديل للجملة التالية

Select First_Name,Last_Name From tblContact Where First_Name Like '% + Value + %'

 

مواضيع و دروس
الكتابة بعدة ألوان داخل الــ TetxBoxمكتبة الأكوادتحميل الــ Visual Basic Express 2005
تحميل فيجوال بسيك 6أكواد × أكواددروس في الخوارزميات
لتحميل عدة إصدارات من كريستال ريبورتتحميل برنامج Activ Skin 4.3جمل الــ Sql من الألف إلى الياء
معظم المواقع المختصة بالفيجوال بيسيكموقع كويس للأيقوناتمرجع شامل لأدوات ActivX
كيفية نطق الحرف المكتوب شرح عن كيفية إقامة علاقة مع Data Reprot باستخدام الــ DataEnvironment علاقة مع الـ Datareport بدون استخدام DataEnvironment (( شرح ))
كتاب Migrating From DAO to ADOإضافة لـ VB6 بريمج IndenterVB, إضافة لبيئة تطوير فيجوال بيسك 6حوار بينى و بين عضو حول ال winsock , اتمنى ان يعجبكم
Smart Indenter 3.5 لتنسيق الأكواد, هديه لكل الأعضاء السلسلة الدهبية في المواضيع العلمية ، إستغلال الـ Balloons في الـ Windows XP مصفوفات الأدوات Control Arrays افكار وتلميحات ! , لمن افتقدها من أيام الـ VB6.0
جعل خلفية الـ Mid Form تظهر بالكامل خواص الاداة Winsock لربط الاجهزة عن طريق الانترنتكيف يتم عمل تقارير بإستخدام HTML

7.gif
#15

- بالنسبة لموضوع الحساسية لحالة الأحرف - لاأدري في الوقت الحالي -

- بالنسبة للجملة

Select First_Name,Last_Name From tblContact Where First_Name Like '% + Value + %'

فيمكن عملها ببساطة

dim Cont = from co in dataset.tblContact _
				   where first_name like "*" & value & "*" _
				   select co.first_name, co.last_name

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 3 فبراير 2008 في 12:28

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#16

شكراً جزيلاً أخي الفاضل محمد سامر أبو سلو

ً

مواضيع و دروس
الكتابة بعدة ألوان داخل الــ TetxBoxمكتبة الأكوادتحميل الــ Visual Basic Express 2005
تحميل فيجوال بسيك 6أكواد × أكواددروس في الخوارزميات
لتحميل عدة إصدارات من كريستال ريبورتتحميل برنامج Activ Skin 4.3جمل الــ Sql من الألف إلى الياء
معظم المواقع المختصة بالفيجوال بيسيكموقع كويس للأيقوناتمرجع شامل لأدوات ActivX
كيفية نطق الحرف المكتوب شرح عن كيفية إقامة علاقة مع Data Reprot باستخدام الــ DataEnvironment علاقة مع الـ Datareport بدون استخدام DataEnvironment (( شرح ))
كتاب Migrating From DAO to ADOإضافة لـ VB6 بريمج IndenterVB, إضافة لبيئة تطوير فيجوال بيسك 6حوار بينى و بين عضو حول ال winsock , اتمنى ان يعجبكم
Smart Indenter 3.5 لتنسيق الأكواد, هديه لكل الأعضاء السلسلة الدهبية في المواضيع العلمية ، إستغلال الـ Balloons في الـ Windows XP مصفوفات الأدوات Control Arrays افكار وتلميحات ! , لمن افتقدها من أيام الـ VB6.0
جعل خلفية الـ Mid Form تظهر بالكامل خواص الاداة Winsock لربط الاجهزة عن طريق الانترنتكيف يتم عمل تقارير بإستخدام HTML

7.gif
#17

تصحيح هام

ورد في المقال مثال Order By مكررا بالخطأ مكان مثال Join وهذا مثال عن Join

			Dim Intrst = From i In DsDesposits.InterestRates _
						 Join d In DsDesposits.Deposits _
						 On i.InterestID Equals d.InterestID _
						 Select i.InterestID, i.InterestRate, i.DepositPreiod

وهذا مثال آخر

			Dim ViewData = From Cu In DsDesposits.Customers _
			   Join Dp In DsDesposits.Deposits On Dp.CustomerID Equals Cu.CustomerID _
			   Join DepPer In DsDesposits.InterestRates On DepPer.InterestID Equals Dp.InterestID _
			   Join CaDp In DsDesposits.CalculatedDepsits On CaDp.DepositID Equals Dp.DepositID _
			   Where CaDp.CalculationReason = 2 _
			   And CaDp.CalculationDate >= FromDate _
			   And CaDp.CalculationDate <= ToDate _
			   Select Cu.Name, Dp.DepositNumber, Dp.DepositAmount, Dp.StartDate, _
			   CaDp.CalculationDate, DepPer.DepositPreiod

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 14 يوليو 2008 في 23:23

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#18

مرحبا.. أخي شكراً على الشرح..

هل لي بسؤال .. أتمنى أن تتحملني.. لأن توجد لدي قاعدة معلومات Sql server

و أريد أن ربطها ب linq بحث يكون لينك هو خيط الذي يربط صفحة ب قاعدة البيانات..

حيث المستخدم يقوم بأدخل معلوماته مثلاً..

يدخل رقم سيارته أن كان موجودة داخل قاعدة البيانات تظهر له النتيجة أم لم تكن موجودة لا تظهر .. نخبره بأن هذا الرقم غير موجود..

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

لأن تعبت منADO و لازلت لا أعرف كيف أعمل Connection String

للداتا بيس موجودة لدي..

عذراً على الأطالة أو أن بدء السؤال بسيط.. أو ساذج..

#19

هل قرأت مواضيعي المتعلقة بـ Linq to SQL ففيها الإجابة عن سؤالك

مثال عن استخدام Linq To SQL مربوطا مع Combobox لفلترة البيانات في Datagridviev

مثال عن Linq To Sql, Vb2008

إنشاء فئات Linq To SQL باستخدام O/r Designer, VB2008

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 5 أغسطس 2008 في 22:13

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

مواضيع مشابهة