استفاده از دستورات SQL در LINQ to SQL

درسنامه درس 15 از سری آموزش LINQ

سلام خدمت کاربران عزیز. در این جلسه قصد داریم به آموزش linq در سی شارپ بپردازیم و نحوه ی نوشتن کدهای SQL با استفاده از LINQ در C# را مورد بررسی قرار دهیم.

دوستان گرامی توجه داشته باشید که این درس بسیار ساده و روان می باشد اما برای درک بهتر مطالب لازم است با مبانی اولیه SQL Server آشنایی کافی داشته باشید.

ابتدا یک پروژه از نوع Console App ایجاد کنید و در آن یک مدل LINQ to SQL Calsses با نام مناسب تولید نمائید.

در مرحله بعدی لازم است یک جدول ساده به مدل اضافه کنید (می توانید از یکی از جدول هایی که در قسمت های قبلی آموزش ایجاد کرده استفاده یا جدول زیر را ایجاد کنید).

جدول اصلی
جدول اصلی

فیلد ID را از نوع کلید اصلی و Indetity قرار دهید.

حالا جدول را به مدل اضافه کنید تا در ادامه با استفاده از چند متد، عملیات CRUD را در LINQ به وسیله ی کدهای SQL پیاده سازی کنیم.

کار را با Select داده ها شروع می کنیم.

Select اطلاعات

ابتدا کدهای زیر را در پروژه ی خود پیاده سازی کنید تا به توضیح آن ها بپردازیم:

using System;
using System.Collections.Generic;
namespace Mypro
{
    class Program
    {
        static void Main(string[] args)
        {
            ContactModelDataContext context = new ContactModelDataContext();
            IEnumerable<Contact> contact = context.ExecuteQuery<Contact>("Select * from contact");
            foreach (Contact item in contact)
            {
                Console.WriteLine(item.Name+"\t"+item.Phone);
            }
           
        }
    }
}

همان طور که می دانید انجام عملیات Select به نوعی دارای خروجی است که خروجی آن را می توان اطلاعات جدول در نظر گرفت. در LINQ با استفاده از متد ExecuteQuery می توان انواع عملیات Select را انجام داد.

موس را بر روی این متد برده و ورودی و خروجی آن را با دقت بررسی کنید. خواهید دید که خروجی آن از نوع IEnumerable<> است. ورودی اولیه ی آن نوع داده ی String را که در واقع Query است، مشخص می کند. ورودی دوم آن آرایه ای از Params Object است که در مثال بعدی آن ها بررسی خواهیم کرد.

توجه به این نکته بسیار ضروری است که این متد به صورت Generic تعریف شده است. پس در زمان اسفاده از آن، باید نوع داده ی آن مشخص شود. در این مثال داده های ما از جنس کلاس Contact می باشد.

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

خروجی مثال
خروجی مثال

حال اجازه دهید با تغییر این مثال، با کاربرد ورودی دوم متد ExecuteQuery آشنا شویم. پس کد را به صورت زیر تغییر دهید:

IEnumerable<Contact> contact = context.ExecuteQuery<Contact>("Select * from contact where ID={0}",1);

در این حالت قصد ما انتخاب یک رکورد با ID مشخص است که به این صورت انجام می شود. توجه داشته باشید که پارامترهای ورودی، هر تعدادی می تواند باشد.

کد زیر را در نظر بگیرید:

IEnumerable<Contact> contact = context.ExecuteQuery<Contact>("Select * from contact where ID={0} and Name={1}", 1, "David ");

توجه به این نکته بسیار ضروری است که نوع پارامتری که به متد ارسال می شود، باید دقیقا با نوع پارامتر به کار برده شده در جدول یکسان باشد. مثلا در مورد بالا نوع فیلد Name از نوع String است، پس لازم است پارامتر جایگزین {1} از نوع String باشد.

Insert, Update, Delete اطلاعات

دلیل این که هر سه این عملیات را با هم بررسی می کنیم این است که هر سه، به وسیله ی یک متد انجام می شوند و  تعیین کننده ی عملیات، به نوع Query نوشته شده بستگی دارد.

کد زیر را به پروژه ی خود اضافه کنید:

int res = context.ExecuteCommand("Insert into Contact(Name,Phone,Address) values({0},{1},{2})","Valeria", "246 Mill Place","+1(848)-0334933");

با استفاده از متد ExecuteCommand می توان عمل Insert را پیاده سازی کرد. پارامترهای ورودی این متد دقیقا مانند متد ExecuteQuery است اما خروجی آن از نوع int است.

همان طور که می دانید عملیات های Insert و Update و Delete بر خلاف Select دارای نتیجه نیستند و فقط بر روی جدول تغییر ایجاد می کنند. خروجی متد ExecuteCommand فقط نشان دهنده ی موفقیت در انجام عملیات است که در صورت موفق بودن، مقداری مخالف صفر باز می گرداند که در جای مناسب می توان از آن استفاده کرد.

برای دو عمل Update و Delete نیز روال کار به همین صورت خواهد بود. به حالت های زیر توجه کنید:

int res = context.ExecuteCommand("Delete From Contact where ID=2");

با استفاده از همان متد ExecuteCommand و نوشتن Query مناسب، به راحتی عمل Delete اطلاعات را انجام دادیم.

به همین صورت عملیات Update را پیاده سازی می کنیم:

int res = context.ExecuteCommand("Update Contact set Name={0}, Phone={1} where ID={2}", "Jenna", "+1(030)-1880124",1);

سوال: آیا می توان از Strode Procedure های نوشته شده در SQL Server به این طریق استفاده کرد؟

پاسخ: بله، ابتدا لازم است Strode Procedure نوشته شده را به مدل اضافه کنید که آموزش آن را می توانید در این بخش مطالعه کنید. بعد از آن لازم است با توجه به نوع Procedure، از یکی از متدهای معرفی شده استفاده کنید.

به مثال زیر توجه کنید:

using System;
using System.Collections.Generic;
namespace Mypro
{
    class Program
    {
        static void Main(string[] args)
        {
            ContactModelDataContext context = new ContactModelDataContext();
            IEnumerable<Contact> contact = context.ExecuteQuery<Contact>("execute SelectItem {0}",3);
            foreach (Contact item in contact)
            {
                Console.WriteLine(item.Name+"\t"+item.Phone);
            }
           
        }
    }
}

در این مثال من از قبل یک Procedure نوشتم و به مدل اضافه کردم؛ به این صورت که یک عدد به عنوان ID می گیرد و رکورد مشخصی را باز می گرداند. کافی است با استفاده از نام Procedure از آن استفاده کنیم. به نوع ارسال پارامتر به Procedure دقت کنید که کاملا شبیه به اجرای یک Procedure در زبان SQL است - در اینجا هدف من نمایش رکوردی با ID=3 است - برنامه را اجرا و خروجی را مشاهده کنید.

خب دوستان این بخش از آموزش linq در سی شارپ هم به پایان رسید. موفق باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش LINQ توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.