برنامه نویسیمقالات

نحوه استفاده از Linq To SQL در سی شارپ

آموزش سی شارپ

آموزش Linq To SQL در سی شارپ

 

بسیاری از دوستان در به کار بردن دستوارت معمول Ado.Net در Linq مشکل دارند و فکر می کنند کار سختیه !! . در این مقاله سعی می کنم که نحوه تبدیل دستوارت معمول و کاربردی SQL مانند: Select ، مرتب سازی ، گروه بی ، جستجو کردن و … را به عبارت های معادل آن در Linq To SQL شرح بدهم. از جداول زیر در این مقاله استفاده می کنیم:

جدول Users

جدول UserClients

ساختار Linq


دستور Select :

در کوئری زیر تمام رکوردهای جدول Users با تمام ستون هایش نمایش داده می شود:

کوئری SQL :

SELECT * FROM [User]

کوئری Linq دستور بالایی:

var user = from u in Users
select u;

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


دستور Select همراه با ستون مشخص :

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

کوئری SQL :

Select FirstName, LastName from [User]

کوئری Linq دستور بالایی:

from u in Users
select new
{
    u.FirstName,
    u.LastName
};

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


فیلتر کردن داده های انتخابی:

خوب برای استفاده از شرط و فیلتر کردن داده هامون ، از عبارت where در دستور Select استفاده می کنیم:

کوئری SQL :

Select firstname,LastName from [User] where id = 3

کوئری Linq دستور بالایی:

from u in Users
where u.Id ==3
select new
{
    u.FirstName,
    u.LastName
}

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


برای داده های رشته ایی String:

برای فیلتر کردن داده های رشته ایی در SQL از عبارت Like استفاده می کنیم:

کوئری SQL :

SELECT [Id], [FirstName], [LastName], [Email],
[DisplayName], [Address1], [Address2], [Password], [Role]
FROM [User]
WHERE [Email] LIKE '%pranay%'

یا

SELECT [Id], [FirstName], [LastName], [Email],
[DisplayName], [Address1], [Address2], [Password], [Role]
FROM [User]
WHERE [Email] LIKE 'pranay%'

برای اعمال کردن شروط بالایی بروی ستون های رشته ایی باید از توابع Contains و StartWith استفاده کنیم:

کوئری Linq دستورات بالایی:

from u in Users
where u.Email.Contains ("pranay")
select u

یا

from u in Users
where u.Email.StartsWith ("pranay")
select u

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


پیوند دادن دو جدول:

Inner Join

Inner Join چگونه میتونیم رکوردهای مشترک بین دو جدول رو از طریق فیلد مرتبط میان جدول ها ،بخوانیم . کوئری SQL ، برای Inner Join :

SELECT [User].[Id], [FirstName], [LastName], [UserId], [MobileNo]
FROM [User]
INNER JOIN
[UserClients]
ON [User].[id] = [UserId]

در Linq هم از کلمه کلیدی Join استفاده می کنیم:

var user = from u in Users
           join uc in UserClients on u.Id equals uc.UserId
           select new
           {
               u.Id,
               u.FirstName,
               u.LastName,
               uc.MobileNo,
               uc.imeiNO,
               uc.Id,
           };

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


Outer Join

Outer Join همانند Inner Join می باشد با این تفاوت که همه رکوردهای جدول چپ و در صورت نبود مقدار مشترک در جدول راست مقدار Null رو برمیگردونه. کوئری SQL برای Outer Join :

SELECT [t0].[Id], [FirstName], [LastName],
[UserId] AS [UserId], [MobileNo] AS [MobileNo]
FROM [User] AS [t0]
LEFT OUTER JOIN [UserClients] ON ([t0].[id]) = [UserId]

 

در Linq برای انجام outer join ، نیاز به استفاده از تابع DefaultIfEmpty دارید:

var user = from u in Users
           join uc in UserClients on u.Id equals uc.UserId
           into myuserwithclient
           from m in myuserwithclient.DefaultIfEmpty()
           select new
           {
               u.Id,
               u.FirstName,
               u.LastName,
               m.UserId,
               m.MobileNo
           };

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


مرتب کردن داده ها Sort :

در SQL برای مرتب کردن دادها تون نیاز به اعمال کردن شرط ORDER BY با کلمات کلیدی ASC و DESC هستید .کوئری SQL :

مرتب کردن صعودی Ascending :

Select * from [User] order by firstName

مرتب کردن نزولی Descending :

Select * from [User] order by firstName desc

در Linq هم مثل SQL از ORDER BY استفاده می کنیم با این تفاوت به جای ASC و DESC از ASCENDING و DESCENDING بهره می بریم:

//صعودی
var user = from u in Users
orderby u.FirstName
select new
{
u.FirstName,
u.LastName
}

یا

//نزولی
var user = from u in Users
           orderby u.FirstName descending
           select new
           {
               u.FirstName,
               u.LastName
           };

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


گروه بندی داده ها:

گروه بندی داده های انتخابی ، اجازه استفاده از توابعی مانند : SUM, MAX, MIN, COUNT و … را به شما می دهد.برای گروه بندی در SQL از کلمه کلیدی GROUP BY استفاده می کنیم.

[symple_box color=”green” text_align=”center” width=”100%” float=”none”] نکته ایی که باید به خاطر داشته باشید اینه که شما حتما باید لیست ستون هایی رو که میخواین برگشت داده شوند انتخاب نمایید در غیر اینصورت با خطایی Syntax مواجه می شوید.
[/symple_box]

SELECT COUNT(*) AS [test], [UserId]
FROM [UserClients]
GROUP BY [UserId]

کوئری Linq دستور بالایی:

var user = from u in UserClients
           group u by u.UserId into c
           select new
           {
               t1 = c.Key,
               tcount = c.Count()
           };

نکته: بعد از اعمال کردن گروه بندی بروی مجموعه ایی از آبجکت ها در Linq ، ستونی که گروه بندی روی آن اعمال می شود ،به یک ستون کلیدی (key column) تبدیل می شود.

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


فیلتر کردن داده های با استفاده از شروط IN و NOT IN :

بیشتر برنامه نویسان وقتی که کار با Linq رو شروع می کنند در هنگام نوشتن کوئری های IN و NOT IN مرتکب اشتباه می شوند.کوئری SQL :

//IN
SELECT [Id], [UserId], [IMEINo]
FROM [UserClients]
WHERE [UserId] IN (3, 4)

یا

//NOT IN
SELECT [Id], [UserId], [IMEINo]
FROM [UserClients]
WHERE [UserId] NOT IN (3, 4)

در Linq برای پیاده سازی این شروط از تابع Contains استفاده می شود:

//IN
int[] chosenOnes = { 3, 4 };
var user = from u in UserClients
           where chosenOnes.Contains(u.UserId.Value)
           select new { u.id, u.userid, u.ImeiNo };

یا

//NOT IN
int[] chosenOnes = { 3, 4 };
var user = from u in UserClients
           where !chosenOnes.Contains(u.UserId.Value)
           select u;

نکته: در لینک برای In , Not In از یک تابع یکسان استفاده میشه با این تفاوت که سمبل ! (not) استفاده میشه.

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


فیلتر کردن داده با شماره ردیف Row Numbers :

خب در اینجا میخوام به شما نشان بدم که چه جوری داده هایتان رو توسط شماره سطرها فیلتر کنید. در (SQL Server 2005) از تابع RowNumber و استفاده از <=, >=, or BETWEEN این کار رو انجام میدهیم. کوئری SQL:

SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [id]) AS [ROW_NUMBER],
[id], [FirstName], [LastName], [Email], [DisplayName],
[Address1], [Address2], [Password], [Role]
FROM [User] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN 11 AND 20
ORDER BY [t1].[ROW_NUMBER]

در کوئری بالا مشاهده می فرمایید که به تابع ROW_NUMBER عددی اختصاص داده شده تا از ردیف 10 تا 20 رو در خروجی نشون بده . در Linq برای این کار از دو تا تابع استفاده می کنیم:

  • Skip : این تابع از تعداد مشخصی عناصر صرف نظر می کند و عناصر باقی مانده در کوئری را برمی گرداند.
  • Take : این تابع تعداد مشخصی عناصر رو از ابتدا بر می گرداند.

کوئری Linq دستور بالایی:

var users = from u in Users
            select u;
var filterUsers = users.OrderBy(p => p.Id).Skip(10).Take(10);

درکد بالا مشاهده می کنید که ابتدا دادها مون رو میخونیم بعد با استفاده از این دو تابع سطرهای بین 11 تا 20 را برمی گردونیم.

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

گراف زیر چگونگی واکشی اطلاعات را به شما نمایش می دهد:


استفاده از عملگر Ternary در Linq :

نمی دونم تا چه حد با عملگر Ternary آشنایی دارید یا نه ؟

استفاده از این عملگر در Linq:

var user = from u in Users
           join uc in UserClients on u.Id equals uc.UserId
           into myuserwithclient
           from m in myuserwithclient.DefaultIfEmpty()
           select new
           {
               u.Id,
               FirstName = u.FirstName,
               LastName = u.LastName,
               UserId = m.UserId,
               MobileNo = (m.MobileNo == null) ? "N/A" : m.MobileNo
           };

در خط 11 معنای این عبارت یعنی این که فیلد MobileNo برابر با Null باشد مقدار N/A رو داخلش بزار در غیر اینصورت خود مقدار فیلد باشد. (دستور شرطی با سینتکس متفاوت)

به شیوه ایی دیگه هم میشه کوئری بالا رو نوشت .دو تاشون شبیه به هم هستند:

var user = from u in Users
           join uc in UserClients on u.Id equals uc.UserId
           into myuserwithclient
           from m in myuserwithclient.DefaultIfEmpty()
           select new
           {
               u.Id,
               FirstName = u.FirstName,
               LastName = u.LastName,
               UserId = m.UserId,
               MobileNo = m.MobileNo == null ?? "N/A"
           };

عجب آموزش طولانی شد امیدوارم که مفید بوده باشه چون نزدیک 3 4 ساعت مشغول نوشتنش بودم. ;)

 


برای مشاهده کلیه سورس های برنامه سی شارپ کلیک نمایید.

تمامی مطالب توسط تیم سافت ساز ترجمه و جمع آوری می شود . منبع سافت ساز

 

امتیاز دهی به این مطلب :

امتیاز سافت ساز

لطفا به این مطلب امتیاز دهید ?

User Rating: 4.32 ( 6 votes)

نوشته های مشابه

دکمه بازگشت به بالا