LINQ To SQL چیست؟

LINQ to SQL ابزاری قدرتمند است که به برنامه نویسان اجازه دسترسی به دیتابیس ها را مانند اشیاء در سی شارپ می دهد.با استفاده از LINQ to SQL قادر خواهید بود به جای یادگیری SQL از عملگرهای پرس جوی LINQ و متدهای آن استفاده کنید. LINQ to SQL دارای یک API برای ایجاد و دستکاری دیتابیس می باشد. پرس و جو های LINQ و فراخوانی های متدهای API به دستورات SQL تبدیل می شوند ، که این دستورات برای ایجاد تغییرات یا دریافت پرس و جوها از بانک اطلاعاتی ، اجرا می شوند . LINQ to SQL یکی از روش های بسیار پیشرفته برای دسترسی به بانک اطلاعاتی توسط سی شارپ و دات نت می باشد .

به این نکته توجه کنید که LINQ to SQL فقط زمانی قابل اجرا است که شما از SQL Server به عنوان دیتابیس استفاده می کنید. دیتابیسی که قرار است در این آموزش مورد استفاده قرار بگیرد دیتابیس Northwind می باشد. اگر نسخه آزاد Visual C# Express را در اختیار دارید لازم است به یک فایل دیتابیس با پسوند .mdf دسترسی داشته باشید. دیتابیس Northwind در صورتی که درست نصب شده باشد در مسیر C:\SQL Server 2000 Sample Databases قرار دارد. برای قابل مشاهده کردن پسوند فایل دیتابیس به Control Panel رفته و از گزینه Folder Options بر روی سربرگ دوم آن یعنی View کلیک و تیک “Hide extensions for known file types” را برداشته و دکمه OK را کلیک نمایید. فایل های دیتابیسی که در SQL ساخته می شوند از جمله Northwind دارای پسوند .mdf هستند. SQL Server Express 2008 یک پوشه پیشفرض برای ذخیره فایل های دیتابیس دارد که در مسیر C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data می باشد. از آنجاییکه یک نسخه از دیتابیس Northwind.mdf در این مسیر قرار دارد لازم به ایجاد آن نیست. ویژوال استودیو دارای ابزارهای قدرتمندی برای تولید کلاس های LINQ to SQL با استفاده از Object Relational Designer می باشد. شما می توانید به راحتی با ماوس جداول را در این محیط کشیده و رها کنید(drag and drop) تا ویژوال استودیو به طور خودکار کلاس های لازم برای مرتبط کردن جداول و سطرهای هر جدول خاص و دیتابیس را تولید کند. مشاهده می کنید که جداول از تعدادی ستون یا فیلد تشکیل شده است ،این ستون ها شامل محتوای جدول مورد نظر می باشد .

در این محیط فلش هایی هم دیده می شوند که ارتباط بین جداول را نشان می دهند. به شکل زیر توجه کنید :
linq-to-sql-1001
کلاس ایجاد شده سطر های هر جدول را به شما نشان می دهد .

به عنوان مثال ما یک جدول به نام Employees داریم. ویژوال استودیو به طور خودکار نام جدول را به شکل مفرد در می آورد و یک شئ با نام Employee ایجاد می کند که نماینده هر سطر یا رکورد جدول مذکور می باشد. یک کلاس متناظر از نوع Table<TEntity> واقع در فضای نامی System.Data.Linq برای هر جدول موجود در محیط LINQ to SQL ایجاد می شود . کار TEntity ساخت یکی شی نظیر به نظیر می باشد وقتی که دو جدول مثل هم در یک کلاس داشته باشید. به عنوان مثال جدول Employees دارای کلاس متناظر Table<Employee> می باشد. برای جلوگیری از خطا درستون ها و رکورد های موجود این شی یک نمونه از جدول مورد نظر می سازد.

Table<TEntity> رابط IQueryable<TEntity> از فضای نام System.Linq را پیاده سازی می کند. وقتی یک عملیات پرس و جوی LINQ یک شیء از این رابط را پیاده سازی می کندو نتایجی از یک دیتابیس را بدست می آورد ، نتایج به صورت خودکار در کلاس های LINQ to SQL ذخیره می شوند.

برای اینکه بتوانید از کلید داخلی و خارجی در این محیط استفاده کنید ابتدا در محیط ویژال استدیو باید ارتباط بین دو جدول را از طریق فیلد های مشترک ایجاد کنید برای ایجاد فیلد های مشترک بهتر است ارتباط از طریق کلید اصلی هردو جدول انجام شود. با ارتباط دادن دو جدول از طریق فیلدهای مشترک می توانید از طریق کلید خارجی به محتویات جدول ارتباط داده شده دسترسی پیدا کنید.

به عنوان مثال، دو جدول با نام های Employees و Companies هر دو فیلدی به نام CompanyID دارند. CompanyID کلید اصلی جدول Companies بوده ولی در جدول Employees یک کلید خارجی است که به CompanyID در جدول Companies اشاره دارد.

وقتی که ویژوال استدیو   جداول کلاس را می سازد ارتباط آن ها را نیز از طریق کلید خارجی مورد بررسی قرار می دهد، کلاس Employee از جدول Employee داری یک ارتباط با جدول Order می باشد، به همین دلیل با فلش به هم مرتبط هستند، زمانیکه به اطلاعات جدول Employee نیاز داشته باشیم از طریق ستون مشابه(کلید خارجی) به اطلاعات جدول Employee دسترسی خواهیم داشت .

LINQ to SQL کلاس DataContext را که از System.Data.Linq.DataContext ارث بری می کند، ایجاد می کند. این کلاس مسئول اتصال برنامه و دیتابیس است. به ازای هرگونه تغییر در جداول ، این تغییر در کلاس LINQ to SQL نیز باید اعمال گردد این تغییرات باید به صورتی ایجاد شود که جداول تغییر یافته جایگزین جداول قبلی شوند.

ویژوال استودیو به طور خودکار یک DataContext در قالب   Database> DataContext> ایجاد می کند که در آن<Database> نام جدول می باشد. به عنوان مثال هنگام استفاده از دیتابیس Northwind یک NorthwindDataContext با خواص مربوط به هر جدول ایجاد می شود. این خواص شامل مجموعه ای از اشیاء که نماینده سطرهای هر جدول می باشند، هستند. به عنوان مثال کلاس NorthwindDataContext یک خاصیت Employees که مربوط به جدول Employees است، دارد. این خاصیت مجموعه ای از اشیاء می باشد که نماینده سطرهای جدول می باشد. در درس بعد با یک مثال نحوه ارتباط با دیتابیس را با استفاده از تکنولوژی LINQ to SQL را آموزش می دهیم.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. mysun پاسخ دادن

    سلام.
    من یک دیتا بیس درست کردم دارای دو فیلد date هست .یکیشون برای وارد کردن تاریخ روزی که مثلا کالای من ارسال میشه و اون یکی موقع دیافت کالا رو به عنوان دریافت زمان کالا رو تعریف کردم. میخوام تا زمان دریافت کالا اون فیلد خالی بمونه که مشکلی با برنامه نویسی ندارم یا کلا به برنامه نویسی خاصی نیاز نداره.
    من میخوام که این تاریخ ها رو خودم توی یک تکس باکس بنویسم ولی مشکل اینجاست که تکس باکس رشته ای یا string هست و برنامه خطا میگیره. میشه کمکم کنید که چه کدی در تکس باکس بنویسم که تاریخ رو توسط خودم وارد کنم و مشکلی برای دریافت تاریخ توسط کاربر نداشته باشه… از تکنلوژی LINQ TO SQL هم دارم برا پروژه ام استفاده میکنم.

    • علی بامدادي پاسخ دادن

      با سلام

      درمورد سوال شما دو راه وجود داره که باهم بررسی می کنیم :

      ۱- نوع داده ای که در جدول تعریف کردین از نوع Date هست ، و وقتی می خواین ثبتش کنید
      بایدمقدار تکس باکس یا ماسک تکس باکس رو به نوع Date تبدیل کنید با استفاده از دستور زیر :

      DateSend= Convert.ToDateTime(maskedTextSent.Text);

      اما مشکلی که به وجود میاد تاریخ ها برعکس ثبت میشن که باید به تاریخ شمسی تبدیل شون کنید .

      اما راه دوم بیایید از نوع nvarchar تاریخ های خودتون رو در نظر بگیرین ، با این کار نیازی به تبدیل تاریخ نخواهید داشت و تاریخ ها به صورت فارسی ثبت خواهند شد .

      آموزش تصویری هم به ایمیل شما فرستاده شد .

      بازم سوالی داشتین برام ایمیل کنید .

  2. cs پاسخ دادن

    سلام
    توضیحاتتون بسیار عالی بود.
    تشکر.

    • یونس ابراهیمی پاسخ دادن

      سلام، ممنون بابت لطفتون

  3. حسین پاسخ دادن

    سلام DATACONTEXT من با پایگاهم ارتباط برقرار نمیکنه وقتی عمل INSERT انجام میدم تو جدول ثبت نمیشه ولی تو DATAGRID نمایش داده میشه.