تتمحور معظم التطبيقات حول البيانات، إلا أن معظم مستودعات البيانات هي قواعد بيانات علائقية. على مر السنين، قام المصممون والمطورون بتصميم تطبيقات تعتمد على نموذج الكائن.
الكائنات مسؤولة عن توصيل المكونات التي تصل إلى البيانات - تسمى طبقة الوصول إلى البيانات (DAL). وهنا علينا أن نأخذ بعين الاعتبار ثلاث نقاط:
لا يلزم تخزين جميع البيانات التي يتطلبها التطبيق في مورد واحد. يمكن أن يكون هذا المورد قاعدة بيانات علائقية أو كائن أعمال أو ملف XML أو خادم ويب.
يعد الوصول إلى الكائنات الموجودة في الذاكرة أسهل وأرخص من الوصول إلى البيانات في قواعد البيانات وملفات XML.
لا يتم استخدام البيانات التي تم الوصول إليها بشكل مباشر، ولكن يتم تفريغها وفرزها وتجميعها وتعديلها وما إلى ذلك.
لذلك سيكون من المفيد جدًا لو كانت هناك أدوات يمكنها بسهولة دمج جميع أنواع البيانات باستخدام بضعة أسطر فقط من التعليمات البرمجية - أدوات يمكنها دمج البيانات من مصادر مختلفة وتكون قادرة على تنفيذ عمليات البيانات الأساسية.
يعد الاستعلام اللغوي المتكامل (LINQ) أحد هذه الأدوات. يعد LINQ امتدادًا لـ .NET Framework 3.5 ولغة الإدارة الخاصة به تجعل الاستعلامات أشبه بالكائنات. إنه يحدد بناء الجملة ونموذج البرنامج المشترك الذي يسمح لنا باستخدام بناء الجملة الاصطلاحي لإكمال البحث عن أنواع مختلفة من البيانات.
يمكن استخدام العمليات ذات الصلة مثل البحث، والمشروع، والارتباط، والمجموعة، والتقسيم، وعمليات التعيين، وما إلى ذلك في LINQ، ويدعم مترجمو C# وVB في .NET Framework 3.5 بناء جملة LINQ، مما يسمح لها بتخزين بيانات التكوين، دون اللجوء إلى أدو.نت.
على سبيل المثال، للاستعلام عن جدول المستهلكين في قاعدة بيانات Northwind، باستخدام LINQ في C#، يجب أن يكون الرمز كما يلي:
var data = from c in dataContext.Customerswhere c.Country == "Spain"select c;
في:
تمر الكلمة الأساسية من بشكل منطقي عبر كل مجموعة بالتسلسل.
التعبيرات التي تحتوي على الكلمة الأساسية حيث تقارن كل كائن في المجموعة.
ستقوم عبارة التحديد بتحديد الكائن المقارن وإضافته إلى القائمة وإعادته.
يتم استخدام الكلمة الأساسية var لإعلان المتغير. نظرًا لأن النوع الدقيق للكائن الذي تم إرجاعه غير واضح، فإنه يشير إلى أنه يجب استنتاج المعلومات ديناميكيًا.
يمكن تطبيق عبارات استعلام LINQ على أي فئة مدعومة بالبيانات ترث من IEnumerable، حيث يمكن أن يكون T أي نوع بيانات، مثل List<Book>.
دعونا نلقي نظرة على مثال لفهم المفهوم. يتم استخدام الفئة التالية في المثال: Book.cs
كتب الفئة العامة {معرف السلسلة العامة {get؛} عنوان السلسلة العامة { get } السعر العشري العام { get } public DateTime DateOfRelease { set; List<Books> list = new List<Books>(); list.Add(new Books { ID = "001"، العنوان = "البرمجة في C#"، السعر = 634.76 مليونًا، DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002"، Title = "تعلم لغة Java في 30 يومًا"، السعر = 250.76 مليون، DateOfRelease = Convert.ToDateTime ("15-08-2011") }); list.Add(new Books { ID = "003"، العنوان = "البرمجة في ASP.Net 4.0"، السعر = 700.00 مليون، DateOfRelease = Convert.ToDateTime("2011-02-05") }); list.Add(new Books { ID = "004"، العنوان = "VB.Net أصبح سهلاً"، السعر = 500.99 مليون، تاريخ الإصدار = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005"، العنوان = "البرمجة في C"، السعر = 314.76 مليون، DateOfRelease = Convert.ToDateTime("2010-" 02-05") }); list.Add(new Books { ID = "006"، Title = "البرمجة في C++"، السعر = 456.76 مليون، DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007"، العنوان = "Datebase Developement"، السعر = 1000.76 مليون، DateOfRelease = Convert.ToDateTime("2010-02-05") }); return قائمة؛ }}
استخدم هذه الفئة في صفحة ويب للحصول على عنصر تحكم بسيط في التسمية لعرض عنوان الكتاب. تقوم طريقة Page_Load بإنشاء قائمة بالكتب وإرجاع العناوين باستخدام استعلام LINQ:
الاستعلام البسيط للفئة الجزئية العامة: System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { List<Books> books = Books.GetBooks(); var booktitles = from b in books حدد b.Title; عنوان var في عناوين الكتب) lblbooks.Text += String.Format("{0} <br />"، title }});
عند تشغيل صفحة الويب، تعرض العلامة نتائج الاستعلام:
تعبير LINQ أعلاه:
var booktitles = from b in books حدد b.Title;
أي ما يعادل عبارة SQL التالية:
حدد العنوان من الكتب
بالإضافة إلى العوامل المستخدمة حتى الآن، هناك العديد من العوامل الأخرى لتنفيذ عبارات الاستعلام. دعونا نلقي نظرة على بعض العوامل والبنود.
يتم استخدام "جملة الانضمام" في SQL لربط جدولي بيانات وعرض مجموعة من البيانات في الأعمدة التي تظهر في كلا جدولي البيانات. يمكن لـ LINQ أيضًا دعم هذه الوظيفة. للتحقق من ذلك، قم بإضافة فئة أخرى باسم Saledetails.cs إلى المشروع السابق:
تفاصيل المبيعات العامة { public int sales { get } public int pages { get } معرف السلسلة العامة {get;} public static IEnumerable<Salesdetails> getsalesdetails() { Salesdetails[] sd = { new Salesdetails { المعرف = "001"، الصفحات = 678، المبيعات = 110000}، تفاصيل المبيعات الجديدة { المعرف = "002"، الصفحات = 789، المبيعات = 60000}، تفاصيل المبيعات الجديدة { المعرف = "003"، الصفحات = 456، المبيعات = 40000}، تفاصيل المبيعات الجديدة { المعرف = "004"، الصفحات = 900، المبيعات = 80000}، تفاصيل المبيعات الجديدة { المعرف = "005"، الصفحات=456، المبيعات = 90000}، تفاصيل المبيعات الجديدة {المعرف = "006"، الصفحات = 870، المبيعات = 50000}، تفاصيل المبيعات الجديدة {المعرف = "007"، الصفحات = 675، المبيعات = 40000}، }؛ return sd.OfType<Salesdetails>();
أضف التعليمات البرمجية في وظيفة Page_Load لإكمال الاستعلام في الجدولين باستخدام معالجة جملة الربط:
protected void Page_Load(object sender, EventArgs e){ IEnumerable<Books> books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); var booktitles = from b in books join s in sales on b.ID يساوي s.ID حدد جديد { الاسم = b.Title، الصفحات = s.pages }؛ عناوين الكتب) lblbooks.Text += String.Format("{0} <br />"، title);}
تظهر صفحة النتائج على النحو التالي:
تسمح عبارة "حيث" بإضافة شروط التصفية إلى الاستعلام. على سبيل المثال، إذا كنت تريد الحصول على قوائم مراجع تحتوي على أكثر من 500 صفحة، فيمكنك تغيير المقبض في طريقة Page_Load لتبدو كما يلي:
var booktitles = from b in books join s in sales on b.ID يساوي s.ID حيث s.pages > 500 حدد new { Name = b.Title, Pages = s.pages };
تقوم عبارة الاستعلام بإرجاع تلك الأعمدة التي تحتوي على عدد صفحات أكبر من 500 فقط:
تسمح هذه الجمل بفرز نتائج الاستعلام. للاستعلام عن العنوان ورقم الصفحة وسعر الكتاب وفرزها حسب السعر، اكتب الكود التالي في مقبض طريقة Page_Load:
var booktitles = from b in books join s in sales on b.ID يساوي s.ID orderby b.Price حدد new { Name = b.Title, Pages = s.pages, Price = b.Price};
Tuple الذي تم إرجاعه هو:
تسمح جملة Let بتعريف متغير وتعيين قيمة محسوبة من البيانات إليه. على سبيل المثال، لحساب إجمالي قيمة المبيعات من قيمتي المبيعات أعلاه، عليك حسابها على النحو التالي:
إجمالي البيع = سعر الكتاب * المبيعات
لإكمال هذه المعادلة، قم بإضافة مقتطف التعليمات البرمجية التالي إلى مقبض أسلوب Page_Load:
تسمح جملة Let بتعريف متغير وتعيين قيمة محسوبة من البيانات إليه. على سبيل المثال، لحساب إجمالي قيمة المبيعات من قيمتي المبيعات أعلاه، عليك حسابها على النحو التالي:
var booktitles = from b in book join s in sales on b.ID يساوي s.ID Let Totalprofit = (b.Price * s.sales) حدد new { Name = b.Title, TotalSale = Totalprofit};
نتائج الاستعلام كما هو موضح أدناه: