صفحه شخصی سید علا سبزپوش

برنامه نویس دات نت و sql_server --ریاضیات

صفحه شخصی سید علا سبزپوش

برنامه نویس دات نت و sql_server --ریاضیات

Entity Framework 4 part ۱۱

Entity SQL  part 2


Using Entity SQL with object queries


در این بخش می خواهم درباره کویری Entity Sql  با objectServic  کمی توضیح بدهم . در واقع ما کویریهای خودمان را بروی object Query  انجام می دهیم .

قبل از هر چیر به مقاله 9 مراجعه کنید و همان مدل را دوباره پیاده کنید . اکنون سعی می کنم با چند مثال ساده نحوه کار را نشان دهم . می خواهیم یک کویری بنویسیم که از جدول Contact  تمام فیلدهای نامی که نام خانوادگی آن Lastname برابر رشته Zhou باشد را بر گرداند ابتدا متغیری برای اتصال یه موجودیت تعریف می کنیم . و.. کد زیر را مشاهد کنید .



همانطور که در بالا مشاهده می کنید . به تعریف متغیر رشته ای به نام esqlQuery دقت کنید . این متغیر در واقع یک کویری برای ما می سازد . این کویری در سطربعدی باید بع عنوان آرگومانی به متغیر query  ارسال شود . متغیر query همانطور که مشاهده می کنید . در طرف راست دارای سه پارامتر است . پارامتر اول در واقع همان دستور کویری است . پارامتر دوم متغیری از نوع کلاس مدل که در اول برنامه تعریف شد د ر واقع رشته کویری ما بر روی این مدل داده ها اجرا می شود و سرانجام پارامتر سوم که حالت موجویت ها را نشان می دهد که بعدها در مورد آن توضیح خواهم داد .

علاوه بر این ما باید پارامترهایی را اضافه کنیم چرا که کویری ما مشروط بود پس در سطر بعدی پارامتر را به همراه مقدار آن اضافه می کنیم و سرانجام با تشکیل حلقه پیمایش نتیجه پرس و جو را مشاهده می کنیم .

مهمترین نکته ای که باید به آن توجه کنید . استفاده از کلاس objectQuery  است . در واقع این کلاس کویریهای ما را بر روی مدل مفهومی conceptual model  اجرا می کند و آن را به صورت یک شی قابل پیمایش نگه می دارد .

بحث در این زمینه بسیار مفصل است که در این مختصر نمی گنجد بنده برای ایجاد هماهنگی در نوشته های با سایت Msdn  مثالهایی را از آن سایت آوردم برای پی گیری بیشتر مثالها می تونید از سایت منبع بقیه مثالهای آموزشی در این مورد را پی گیری کنید .

با تشکر

 

ادامه دارد...

Entity Framework 4 part ۱۰

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


مبحث در این زمینه مفصل است اما اگر بخواهید کاملتر مطالع کنید از این لینک استفاده کنید

ادامه دارد....

Entity Framework 4 part ۹

LINQ To Entities

در بخشهای قبلی در مورد ساختار مدل صحبت کردم و گفتم که یک مدل چگونه ساخته می شود . همچنین بیان کردم که برای انجام پرس و جو چند روش وجود دارد . در این بحش کمی در مورد Linq To Entities  صحبت خواهم کرد ، البیته این بحث بسیار مفصل است که من با دادن لینکهای کاربردی شما را به ادامه آموزش Linq  با مثال از سایت MSDN  دعوت می کنم .


اکنون برای شروع برای اینکه با سایت MSDN  هماهنگ باشیم ما با بانک اطلاعاتی Adventureworks  کار می کنیم . که از این لینک می توانی دانلود کنید . یک پروژه console Application  ایجاد کنید و مدل زیر را برای جدولهای Adress,Contact ,Product,saleorderDetail,SaleorderHeader    از بانک اطلاعاتی ایجاد کنید



اکنون باید با استفاده از دستورات Linq  برای Entites  دستورات کویری بنویسیم . ابتدا دستور select  

یادتان باشد در پروژه خودتان فضاهای نام زیر را حتما اضافه کنید .


using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using System.Globalization;
using System.Data.EntityClient;
using System.Data.SqlClient;
using
System.Data.Common;
موجودیت ما در مدل برنامه به نام AdventureworksEntities  است .. پس حالا اولین کویری خود را می نویسیم . می خواهیم دستوری بنویسیم که رکوردهای جدول Product  را برای ما بازیابی کند .قطعه کد زیر را مطابق شکل در برنامه می نویسیم

خوب اگر به سورس بالا دقت کنید متوجه می شوید که ابتدا باید متغیری  تعریف کنیم که اشاره ای داشته باشد به کلاس AdventureworksEntities  این کلاس در واقع کلاس مدل ما می باشد ، اکنون که متغیری به نام context  تعریف می کنیم که از نوع کلاس AdventureWorksEntities  می باشد .

پس می توانیم به تمام عناصر این کلاس دسترسی داشته باشیم . یکی از موجویتهای این کلاس همان موجویت جدول  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  مثالهایی را از آن سایت آوردم برای پی گیری بیشتر مثالها می تونید از سایت منبع بقیه مثالهای آموزشی در این مورد را پی گیری کنید .


با تشکر

ادامه دارد...