الأربعاء، 7 أكتوبر 2009

تقنية LINQ :language integrated query : تبدد أسوء مخاوفي


أسوء سناريو تخيله عقلي لتعامل مع قواعد البيانات عن طريق البرمجة هو كتابة عشرات أو مئات من الأكواد البرمجية للتعامل مع قاعدة البيانات في الصفحة الواحدة و حفظ أسماء 30 جدول و أسماء الحقول الذي قد يصل بعضها إلى 40 , و هل هذا كل شيء؟ طبعاً  لا , فتوقف تنفيذ المشروع أو أجزاء منه بسبب خطأ في حرف واحد أو نسيان حتى حرف؟
ماذا يمكن أن يكون أسوء من هذا؟
نعم هذا كان حالي عند دخولي في مرحلة البرمجة فما أذكره عن التعامل مع قاعدة البيانات عن طريق الفيجول هو المآسي و البقاء ساعات و ساعات أنظر لتلك الأسطر لأعرف ما الخطأ الذي يمنع التنفيذ و ظهور النتائج أفكار و محاولات و لاكن لا جدوه !
إلى أن تبددت المخاوف بقرئتي لموضع واحد فقط؟ كيف؟
الفضول و حب الإستكشاف و ما أدراك ما افضول و حب الإستكشاف .....................
بدءت قصتي مع هذه التقنية عند دخولي لأحد المنتديات و إذا أرى عنوان يتحدث عن  SQL و قواعد البيانات و تقنية LINQ ؟
فقلت في نفسي LINQ ماهذه التقنية ؟لم يسبق لي أن سمعت بها ! ما علاقتها بقاعدة البيانات ؟ و لم أنتظر حتى أكمل بقيت الأسئلة دخلت الموضع وإذا بالكاتب يتحدث عن تقنية جديدة طرحتها Microsoft مع إصدارها لنسخة Microsoft Visual Studio 2008
مع العلم بأني أستخدم هذه النسخة منذ نزولها تقريباً و لكن لم يسبق لي أن علمت بها .
أزداد شوقي لأعرف عما تقدمه هذه التقنية الجديدة , فبدءت أقرء إلى أن وصلت إلى السطور الذي يقارن فيها الكاتب بين التقنية السابقة
و تقنية LINQ  و كيف أن هذه التقنية أختصرت الوقت و الجهد و الأهم عدد السطور الذي قد تحتاج كتابتها و المفاجأة الكبرى أصبحت تستخدم هذه القاعدة IntelliSense أي مثلما تتعامل مع أي أداة لتظهر خصائصها بمجرد الضغط على النقطة  أصبحت تتعامل هكذا مع قاعدة البيانات؟
كنت أقول في نفسي هل ما يقوله هذا الكاتب حقيقة ؟ هل أصبح التعامل مع قاعدة البيانات و كتابة الإستعلامات بهذه البساطة ؟ يقول  فقط أتصل بالقاعدة ,أضف linq to sql clasesse  و من ثم اضف الجداول للملف و أبدء العمل !!!!!!!!!!!!!
أول ما فعلته هو الذهاب لمحرك البحث و كتبيت LINQ  و اذا بأول موقع Microsoft فتحت الصفحة وبها تعليم التقنية بالفيديو و شرح في MSDN  و و و و و
عدت للموضع أكملت مع الكاتب و كان في نهاية الموضوع كتاب قمت بأنزاله و لكن لم يكن ليكفيني .
عدت لموقع Microsoft  وبدات أشاهد الفيديو التعليمي ؟ لم أصدق ماذا يفعل ؟
 وليس هذا فقط أ كتشفت بأن جميع الكتب الذي تتحدث عن Microsoft Visual  Basic 2008 أو عن  Asp.net 3.5  قامت بتخصيص فصل كامل تتحدث فيه عن هذه التقنية بأختصار !!!!!!!!!!
أما عن نفسي فمع نهاية  ذلك اليوم كنت قد كتبت استعلامي الأول و قرأت كلما استطعت قرأته و مشاهدته عن هذه التقنيه.
و كنت أنتظر فقط أن يأتي صباح اليوم التالي لأخبر زملائي بما أكتشفت و الذين هم بدورهم كانت علامات التعجب تملء وجوههم كأنهم يقولون في انفسهم : ماذا تقول هذه  ؟ عن ماذا تتكلم ؟بين ليلة وضحاها تقول ليس هناك مشكلة ! لقد أصبحت أكبر مشكلة ليس فقط أصغرها بل قد لا تذكر على أنها مشكلة؟
نعم هذه كانت قصت أكتشافي لهذه التقنية أنا لا اعلم رأي أخواني المبرمجن بها و لاكن ما أعرفه بأنها كانت أساس نجاح المشروع , قد يقول البعض بأني منبهره بها لكونها تقنية جديدة ليس إلا , و هنا أقول لا ليس كل تقنية جديدة تظهر قد تكون أفضل من سابقتها و لكن مع هذه التقنية و مع مبتدئين من امثالي , نعم أقول عن نفسي مبتدئه لأني لم أصل لما وصل له غيري من المبرمجين الذين مضو سنوات و سنوات مع هذا البحر , كانت هذه التقنية كحلم تحقق , ففي الوقت الذي كان التعامل مع قاعدة البيانات أكبر المشاكل لدى زملائي الآخرين في مشاريعهم كانت مشكلة لا تذكر معي  .
ففي أيام معدودة أصبحت أكتب لإستعلامات معقدة يدخل فيها ثلاث جداول او أكثر في عدة سطور قد لا تتجاوز الثلاثة أو الإثنين و في دقائق أو ثواني معدودة , و أي سؤال كان يطرح في رأسي عن عملية أو مرادف لأستعلام في التقنية السابقة وما يقابله في التقنية الجديدة مباشرتاً فقط أفتح محرك البحث و أكتب ما أريد أو إذهب إلى MSDN و استكشف و لم أجعل جهلي بهذه التقنية الجديدة يحول بيني و بين الوصول لهدفي.

إذاً هل كان الإمر بهذه السهولة ؟ هل انتهى الأمر ؟
طبعاً لا لم ينتهي فأخيراً وصلت لمشكلة بدءت تهددني للعودة لأستخدم الطرق القديمة , مشكلة أرقتني لأسابيع قاومت فيها حتى آخر نفس لأجد حل يغنيني عن العودة لأسوء كوابيسي......................
مشكلتي كانت كتالي: لقد كان جزء كبير من المشروع يعتمد على التعامل مع جداول غير موجودة بالقاعدة و إنما يتم توليد هذه الجداول بشكل برمجي ومن ثم يتم لا حقاً إضافت السجلات إلى هذه الجداول بشكل برمجي أيضاً أي بالمختصر عملية تتم بشكل آلي و لا علاقة لأحد بهذه العملية , تنفيذها بتقنية القديمة لم يكن يشكل مشكلة  ولكن لم أكن أريد العودة الوضع أشبه بالعامل الذي يملك عربة يحمل فيها ثلاث أو أربع أكياس من الرمل في حين كان سابقاً قبل إيجاد العربة يحمل كيساً واحداً على ظهره في كل مرة ,و فجأة أختفت عربته , فهل يبحث عنها أو يستسلم للأمر و يعود لحمل الأكياس على ظهره؟ لقد كنت مثل هذا العامل لكن فضلت بالتأكيد البحث عن العربة و حتى لو استغرقني ذلك عدة أيام أو اسبوع أو اسبوعين .
المشكلة؟؟
أين تكمن المشكلة ؟ تكمن المشكلة في كيف التعامل مع جداول غير موجودة في القاعدة بتقنية Linq  أي أن هذه الجداول غير موجود في ملف linq to sql clasesse الذي يتم فيه إضافة الجداول ؟ و لا يمكن أن أمرر أسم الجدول  بصورة نصية؟ لإستعلام Linq
و أكثر من هذا عندما بحثت في الإنترنت عن هذه المشكلة و جدت أن الكثير يسأل عن هذه المشكلة و لكن لا يوجد حل ؟
لا يوجد من يجب عن هذه المشكلة ؟
وبعد أيام من البحث المستمر  بدئت تلوح في الأفق خيوط لحل هذه المشكلة ؟ ما اذ وجدت ؟ لم أجد الحل و لكن وجدت أول خيط فيه ؟ماذا كان ؟ لقد كان Dinamic LINQ ؟
وما هذه ؟ هذه بحسب ما فهمت تقنية جمعت بين استخدام التقنية القديمة وLINQ  , ولكن هذه لم تحل المشكلة ؟ ولكن على الإقل كانت بداية  .
و مع البحث و البحث وصلت لدالة تسمى بـ ExecuteQuery وهنا ظهرت مشكلة أخرى؟ وهي c#  علاوة على عدم فهمي لدالة فقد كان معظم من يتحدث عنها كان يتحدث بلغة c# ؟ حاولت فهم و تطبيق الدالة ولكن محاولاتي بائت بالفشل  ؟ ما السبب ؟ السبب ليس لغة فقد أستطعت أن أجدها بلغة Visual Basic  ولكن  المشكلة في نفس الدالة أو بكلام آخر كيف أستخدم هذه الدالة لحل مشكلتي .
كان تعريف الدالة كتالي

 

 لقد كانت مشكلتي هي TResult و الذي كان تعريفها في MSDN  هو The type of the elements in the returned collection.

أي بعد أن أكتب الإستعلام ماذا سيكون نوع البيانات الناتجة ؟ يفترض بها أن تكون سجلات من جدول له تركيب معين و لكن هذا الجدول غير موجود في القاعدة الآن أثناء كتابتي للأستعلام لأنه كما سبق وقلت ينشأ بشكل آلي ؟
 والحل ؟
 لقد وجدت الحل أخيراً و إن كان إيجاده قد كلفني الكثير من الوقت و الجهد و تعب النفسية , ولكن وجدته و كان إيجاده يستحق المحاولة لأنه ما ستغرقته من وقت لإيجاده عوضته بالوقت الذي الذي استخدمت فيه هذه الفكرة في كل إنحاء المشروع و الذي كان سيأخذ مني أضعاف ما كانت سأحتاجه لو عدت لأستخدام التقنية القديمة.
ما هو الحل ؟ الحل هو أني قمت بعمل نموذج للجدول الذي سيتم إنشائه بشكل آلي مطابق له تماماً سواء من نوع البيانات أو العلاقات أو أسماء الحقول.
فكان ناتج هذا الإستعلام هو مجموعة من السجلات التي تطابق هذا الجدول , فهنا جمعت بين استخدامي لتقنية linq و  عدم إحتياجي لحفظ أسما الحقول , فقط يكفي أن تضع النقطة لتظهر قائمة منسدلة بكل الحقول و في نفس الوقت تجنب الوقع في الكثير من الإخطاء التي كانت ستكلفني الكثير.
و هذا مثال لأحد الأكواد الذي  استخدمتها
Dim query As String = "select * from " + Session("ManageFlightId").ToString.Trim + " where Booking_reference = {0}"
Dim x = s.ExecuteQuery(Of Flight_Pas_Templeat)(query, f.Single.Booking_reference.Trim)

وهنا نص المشار له بالأحمر هو اسم الجدول الذي استخدمته كنموذج للتعامل مع الجداول الغير موجدودة في القاعدة.
ولمن أراد اتعرف أكثر على تقنية Linq أو Dinamic LINQ  أو هذه الدالة , سأسرد هنا بعض المواقع
دالة ExecuteQuery
معلومات عن LINQ من MSDN
فيديو تعلمي من موقع ASP.NET
فيديو تعلمي من MSDN
معلومات عن Dynamic LINQ
كتاب تعليم linq بالعربية لصاحبة محمد سامر أبو سلو

هناك تعليقان (2):

  1. عبدالله العصيمي29 ديسمبر 2009 في 8:35 م

    رائع رائع
    بصراحه كلام أستفدت منه كثير

    ردحذف
  2. شكراً أخي لزيارتك
    أتمنى تجرب تتعامل مع هذه التقنية فهي مفيدة فعلاً

    ردحذف