Entity SQL part 2
در این بخش می خواهم درباره کویری Entity Sql با objectServic کمی توضیح بدهم . در واقع ما کویریهای خودمان را بروی object Query انجام می دهیم .
قبل از هر چیر به مقاله 9 مراجعه کنید و همان مدل را دوباره پیاده کنید . اکنون سعی می کنم با چند مثال ساده نحوه کار را نشان دهم . می خواهیم یک کویری بنویسیم که از جدول Contact تمام فیلدهای نامی که نام خانوادگی آن Lastname برابر رشته Zhou باشد را بر گرداند ابتدا متغیری برای اتصال یه موجودیت تعریف می کنیم . و.. کد زیر را مشاهد کنید .
همانطور که در بالا مشاهده می کنید . به تعریف متغیر رشته ای به نام esqlQuery دقت کنید . این متغیر در واقع یک کویری برای ما می سازد . این کویری در سطربعدی باید بع عنوان آرگومانی به متغیر query ارسال شود . متغیر query همانطور که مشاهده می کنید . در طرف راست دارای سه پارامتر است . پارامتر اول در واقع همان دستور کویری است . پارامتر دوم متغیری از نوع کلاس مدل که در اول برنامه تعریف شد د ر واقع رشته کویری ما بر روی این مدل داده ها اجرا می شود و سرانجام پارامتر سوم که حالت موجویت ها را نشان می دهد که بعدها در مورد آن توضیح خواهم داد .
علاوه بر این ما باید پارامترهایی را اضافه کنیم چرا که کویری ما مشروط بود پس در سطر بعدی پارامتر را به همراه مقدار آن اضافه می کنیم و سرانجام با تشکیل حلقه پیمایش نتیجه پرس و جو را مشاهده می کنیم .
مهمترین نکته ای که باید به آن توجه کنید . استفاده از کلاس objectQuery است . در واقع این کلاس کویریهای ما را بر روی مدل مفهومی conceptual model اجرا می کند و آن را به صورت یک شی قابل پیمایش نگه می دارد .
بحث در این زمینه بسیار مفصل است که در این مختصر نمی گنجد بنده برای ایجاد هماهنگی در نوشته های با سایت Msdn مثالهایی را از آن سایت آوردم برای پی گیری بیشتر مثالها می تونید از سایت منبع بقیه مثالهای آموزشی در این مورد را پی گیری کنید .
با تشکر
ادامه دارد...
Entity SQL part 1
در بخش قبل در مورد LINQ to Entities صحبت کردیم . همچنین در بخشهای قبلی اگر خاطرتان باشد گفتم که Entity SQL هم می تواند از طریق ObjectService و هم مستقیما می تواند از طریق EntityClient با بانک اطلاعاتی ارتباط برقرار کند . علاوه بر اینها ذکر کردیم که به دستورات T_SQL شبیه است . بنابراین باید مطالب را در 3 بخش توضیح دهم . بخش اول در مورد شباهتها و تفاوتهای Entity SQL و بخش دوم در مورد تعامل Entity SQL با ObjectService و بخش سوم در مورد تعامل Entity SQL با EntityClient خواهد بود .
بخش اول : تفاوتهای Entity SQL با دستورات T-SQL
1-وراثت و ارتباطات
همانطور که می دانید در مدل ما به دلیل وجود کلاسها .، از مفهوم وراثت و ارتباط بین عناصر پشتیبانی می کند در حالی که T-SQL فقط از ارتباطات بین عناصر پشتیبانی می کند . علاوه بر این Entity SQL در واقع با مدل مفهومی Conceptual entity سرو کار دارد .
2-Collections
Entity SQL همانند یک کلکسیونی از اشیا رفتار می کند در واقع داده های حاصل از آن براحتی در مجموعه Collection ها قابل جایگزاری است .
3-پشتیبانی از عبارتها
شما در دستورات T-SQl فقط با جدولها و ستونهای آن جدولها سروکار دارید در حالی که در Entity SQL علاوه بر اینها شما می توانید در کویری خود عبارتهای مختلفی را نیز داشته باشید .
4-select Value
این عبارت زمانی به کار می رود که ما بخواهیم آیتم مشخصی را بصورت آبجکت یا کلکسیون و یا یک مقدار اسکالر داشته باشیم . به شکل زیر دقت کنید .
در شکل بالا یک ساختاری کلی از عبارت select value در Entity SQL نمایش می دهد . همانطور که می بینید . در دستور بالا ما یک Object بر می گردانیم یعنی حاصل کویری ما یک Object است .با همین فرم بالا ما می توانیم یک ابجکت و یا مقدار مشخص یا کلکسیونی از داده ها داشته باشیم .به شکل زیر دقت کنید .
در کویری اول ما یک شی و در کویری دوم ما یک فیلد و در نهایت در کویری سوم ما یک ستونی بر می گردانیم که از نوع ارجاع Refrence می باشد . مبحث این مطلب بعدها توضیح خواهم داد .
خوب اکنون متوجه شدیم که عبارتهای کویری در Entity SQL تا چه حد می توانند انعطاف پذیر باشند .
اما اگر بخواهیم چندین آیتم انتخاب کنیم دیگر نیازی به عبارت value نخواهیم داشت بلکه ذکر نام آن فیلدها کافی است .
5-Referencing Columns
در دستورات زبان T-SQl به هنگام انتخاب ستونهای جدول نیازی نیست که قبل از نام هر ستون ، نام جدول ذکر شود اما در Entity SQL این امر ضروری است شما باید در مقابل نام هر ستون ، ابتدا نام مرجع آن را هم ذکر کنید .دستور پایین اولی یک دستور T-SQl است و دومی یک دستور Entity SQL است .
select a from T
select t.a as A from T as t
6- عدم پشتیبانی از *
حتما می دانید که در زبان T-SQL هر گاه بخواهیم تمام ستونهای یک جدول را انتخاب کنیم از عبارت * استفاده می کردیم اما در Entity SQL این کار امکان پذیر نیست .
7-عدم پشتیبانی از دستورات DDL و DML در Entity SQL
8-پشتیانی از گروه بندی مستعار
خیلی وقتها شما نیاز دارید برای کویری خود یک گروه بندی تعریف کنید . در زبان T-SQL شما باید نام گروهها را به صراحت و مطابق نام ستونها تعریف کنید در حالی که در زبان Entity SQL شما می توانید از عبارتها مستعار هم استفاده کنید . در عبارت زیر یک دستور T-SQL است .
select b + c, count(*), sum(a)
from T
group by b + c
حال عبارت بالا در Entity SQl مشاهده کنید که چگونه برای گروه نام مستعار انتخاب کرده است .
select k1, count(t.a), sum(t.a)
from T as t
group by t.b + t.c as k1
مبحث در این زمینه مفصل است اما اگر بخواهید کاملتر مطالع کنید از این لینک استفاده کنید
ادامه دارد....
LINQ To Entities
در بخشهای قبلی در مورد ساختار مدل صحبت کردم و گفتم که یک مدل چگونه ساخته می شود . همچنین بیان کردم که برای انجام پرس و جو چند روش وجود دارد . در این بحش کمی در مورد Linq To Entities صحبت خواهم کرد ، البیته این بحث بسیار مفصل است که من با دادن لینکهای کاربردی شما را به ادامه آموزش Linq با مثال از سایت MSDN دعوت می کنم .
اکنون برای شروع برای اینکه با سایت MSDN هماهنگ باشیم ما با بانک اطلاعاتی Adventureworks کار می کنیم . که از این لینک می توانی دانلود کنید . یک پروژه console Application ایجاد کنید و مدل زیر را برای جدولهای Adress,Contact ,Product,saleorderDetail,SaleorderHeader از بانک اطلاعاتی ایجاد کنید
اکنون باید با استفاده از دستورات Linq برای Entites دستورات کویری بنویسیم . ابتدا دستور select
یادتان باشد در پروژه خودتان فضاهای نام زیر را حتما اضافه کنید .
پس می توانیم به تمام عناصر این کلاس دسترسی داشته باشیم . یکی از موجویتهای این کلاس همان موجویت جدول Product است . در سطر بعدی ما باید متغیری تعریف کنیم بصورت آرایه مانند به نام ProductsQuery که این متغیر بر اساس کویری linq مقدار می گیرد . حال کویری ما در کادر قرمز رنگ را مشاهده کنید می بینید که یک حلقه ای ایجاد کرده است که این حلقه for تمام عناصر جدول product موجود در مدل را بصورت یک کلکسیون قابل پیمایش در متغیر ProductsQuery بار گذاری می کند .و در نهایت حلقه foreach این متغیر قابل پیمایش را نمایش می دهد . خواهید دید که چگونه تمام عناصر جدول product نمایش داده می شوند .
Where
در کویری بالا ما تمام عناصر ستون name را بازیابی کردیم ، اکنون سوال این است که چگونه می توانیم عمل فیلتر را انجام دهیم ما می خواهیم فقط نام محصولاتی را نمایش دهیم که با که id آنها یعنی ProductId به فرض بزرگتراز 120 باشد برای این کار کافیست کویری موجودی در کادر قرمز رنگ را بصورت زیر تغییر دهیم .
Join
حتما در بانکهای اطلاعاتی با کویری مواجه بوده اید که از چندین جدول مرتبط ایجاد می شوند در linq این کار توسط دستور join انجام می شود .فرم کلی عبارت بصورت زیر است .
در اینجا منظور از variable همان متغیرها است که هر کدام نماینده یک جدول خواهند بود . اما collection ها منظور همان موجودیتها ی نشان دهنده جدول در بانک اطلاعاتی است . و سرانجا این دو موجودیت باید در یک فیلدی مشترک باشند . مثال زیر در مورد 2 جدول saleorderDetail , saleorderheader است .
در مثال بالا ابتدا جدول مبدا و مقصد رابطه ما توسط عبارت from , join مشخص شده است . سپس بعد از عبارت on باید مشخص کنیم که این جداول در کدام فیلد مشترک هستند و ارتباط بر اساس کدام فیلد است . سپس عبارت where اجرا شده است .
بحث در این زمینه بسیار مفصل است که در این مختصر نمی گنجد بنده برای ایجاد هماهنگی در نوشته های با سایت Msdn مثالهایی را از آن سایت آوردم برای پی گیری بیشتر مثالها می تونید از سایت منبع بقیه مثالهای آموزشی در این مورد را پی گیری کنید .
با تشکر
ادامه دارد...