PDA

View Full Version : آموزش LINQ(قسمت دوم)



zkazemi
جمعه 16 مرداد 1388, 17:59 عصر
آشنایی با سینتکس
به کد های SQL ای که در زیرآمده است دقت کنید.




SELECT FirstName, LastName
FROM Person.Contact
SELECT E.EmployeeID,C.FirstName, C.LastName
FROM Person.Contact AS C
INNER JOIN HoumanResources.Employee AS E ON C.ContactID = E.ContactID
WHERE E.EmployeeID < 100
ORDER BY C.

این سینتکس زبان SQL است که اکثر برنامه نویسان بااون آشنایی دارند.همونطور که ملاحظه می کنید این کد ها همگی با کلمه Select آغاز می شن و بعد از آن نام تعدادی ستون دلخواه که می خواهیم در خروجی نمایش داده شوند نوشته می شود و سپس از کلمه From برای مشخص کردن منبع داده ای که قرار است اطلاعات از داخل آنها واکشی شود استفاده می شود.شما می توانید با امکانات بیشتری که T-SQL در اختیار شما قرار می دهد واکشی های پیشرفته تری را داشته باشید . مثلا می تونید از کلمه where یا order by و... استفاده کنید.
به نظر شما ترتیب اجرای کد های بالا به چه صورت است . در زبان برنامه نویسی SQL ترتیب اجرای یک اسکریپت به صورت زیر است .

(8) SELECT
(9) TOP
(1) FROM
(3) JOIN
(2) ON
(4) WHERE
(5) GROUP BY
(6) WITH
(7) HAVING
(10) ORDER BY

همانطور که ملاحظه می کنید در زمان اجرا ابتدا from اجرا می شود .چرا که منبع داده مورد نظر باید مشخص باشد. سپس هریک از بخش های دیگر که با شماره مشخص شده اند اجرا می شود.همانطور که ملاحظه می کنید دستور select جزو آخرین دستورات در هنگام اجرا یک اسکریپت اس کیو ای است .
یک سوال : چرا فهم این اطلاعات مهم است ؟
بین سینتکس کوئری های نوشته شده با زبان LINQ و ترتیب اجرای کوئری های sql server شباهت بسیار زیادی وجود دارد. به مثال زیر که سینتکس LINQ را نشان می هد دقت کنید.



from c in contact
where c.FirstName.StartsWith("S")
orderby c.LastName

select c


کوئری های LINQ و T-SQL به صورت مشابهی اجرا می شوند.اگرچه سینتکس T-SQL متفاوت از سینتکس LINQ است .
کد زیر همان قطعه کد بالا را در به زبان T-SQL نشان می دهد.



SELECT FirstName, LastName, EmailAddress
FROM Contact
WHERE LEFT(FirstName, 1) = ‘S’

ORDER BY LastName



مفهوم کوئری


در مثال زیر شما یک کوئری به زبان LINQ رو مشاهده می کنید.





from c in contact
where c.FirstName.StartsWith("S")
orderby c.LastName

select c



در کوئری های LINQ ابتداکلمه from نوشته می شودو بعد از آن نام منبع داده ای که در کوئری مورد استفاده قرار خواهد گرفت .به این خط سازنده گفته می شود.و جایی است که داده ها در زمان اجرای کوئری از آنجاآورده می شوند. در اینجا از یک متغییر به نام C جهت ارجاع به هریک از المان های منبع داده استفاده شده است.در این مثال contact نام منبع داده و C متغییر است.
بخش where جهت فیلتر نتایج برگردانده شده از کوئری می باشد.در مثال بالا تمام سطر هایی که فیلد نام آنها با S شروع شده است را بر می گرداند.هم چنین می تونید با استفاده از عملگر های AND و OR چندین فیلتر را اجرا کنید. به مثال زیر دقت کنید.




where c.FirstName.StartsWith("S")
&& c.LastName.StartsWith("A")



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




Where c.FirstName.StartsWith("S")
AND c.LastName.StartsWith("A")



عملگر OR در ویژال بیسیک معادل|| در زبان C# است.




where c.FirstName.StartsWith("S")
|| c.LastName.StartsWith("A")



در ویژال بیسیک




Where c.FirstName.StartsWith("S")
OR c.LastName.StartsWith("A")



در کوئری های LINQ بخش Where , order by اختیاری است . با order by امکان مرتب سازی نتایج برگردانده شده وجود دارد.
در مثال زیر مرتب سازی بر اساس ستون LastName و به صورت نزولی است .



orderby c.LastName descending



همچنین می تونید مرتب سازی را بر اساس چندین ستون نیز انجام دهید.



orderby c.LastName, c.FirstName



در ویژال بیسیک نیز :



Order By c.LastName Descending



در نهایت از کلمه select استفاده می کنید. Select شما رو قادر می کنه تا شکل هر شی که از کوئری برگردانده می شود را تعیین کنید. در این جا همه فیلدهای موجود در c یعنی تمام فیلد های موجود درآن بر گردانده می شوند. شما می تونید فیلد خاصی را ذکر کنید.




from c in contact
where c.FirstName.StartsWith("S")
orderby c.LastName
select c.LastName




زمانی که قرار است تنها مقدار یک ستون برگردانده شود براحتی می توان نام آن ستون را در مقابل دستور select قید کرد.در مثال بالا نوع برگشتی از یک نوع IEnumerable مربوط به contact به نوع IEnumerable از string تبدیل میشود.اما زمانی که بیش از یک ستون به خروجی برگردانده می شود باید از یک یا چند روش دیگر استفاده نمایید. در یک روش شما می توانید از یک نوع تعریف شده مانند Struct استفاده نمایید. در این حالت شما نیاز دارید تا تمام ستون هایی که قرار است به خروجی فرستاده شود را در این struct تعریف نمایید.




struct data
{
public string FN;
public string LN;
public string EA;


}



سپس از این نوع تعریف شده در تعریف کوئری استفاده نمایید.




IEnumberable<data> query = from c in contact
where c.FirstName.StartsWith("S")
&& c.LastName.StartsWith("A")
orderby c.LastName
select new data { LN = c.FirstName, FN = c.LastName, EA = c.EmailAddress};



جهت دستیابی نیز می توانید از دستور foreach استفاده نمایید.



foreach (var item in query)


listbox1.Items.Add(item.FN + " " + item.LN + " " + item.EA);



یک روش دیگر بدون استفاده از نوع تعریف شده است .




var query = from c in contact
where c.FirstName.StartsWith("S")
orderby c.LastName
select new {c.FirstName, c.LastName, c.EmailAddress}



جهت دستیابی نیز می توانید از دستور foreach استفاده نمایید.




foreach (var item in query)
listbox1.Items.Add(item.FirstName + " " + item.LastName + " " + item.EmailAddres);



در این حالت بعد از کلمه new از هیچ نوع تعریف شده ای استفاده نشده است. چرا که در این جا از یک نوع جعلی استفاده کرده ایم . این کوئری از همان نوع منبع داده استفاده می کند.دستور select در مثال بالا خلاصه دستور زیر است:




select new {FirstName = c.FirstName, LastName = c.LastName,
EmailAddress = c.EmailAddress}





Var در مقابل IEnumerable
هنگامی که از Var استفاده می کنید در واقع به صور ضمنی گفته اید که خروجی از نوع منبع داده است . اما زمانی که از IEnumerable<T> استفاده می کنید به صور صریح تعیین می کنید که مجموعه بازگشتی از نوع گفته شده که به عنوان پارامتر IEnumerable آورده شده است می باشد.
LINQ Provider
یک LINQ Provider کتابخانه ای است که توابع ای راکه با استفاده از عملگر های کوئری استانداردفراهم شده اند و برای یک نوع منبع داده خاص می باشد را پیاده سازی می کند .وظیفه یک LINQ Provider اجرا کردن یک کوئری یا دادن آن به دیگر موتور ها جهت اجرا می باشد. LINQ چندین Provider دارد: LINQ to XML ، LINQ to Dataset، LINQ to Object و LINQ to SQL.

sahary
جمعه 05 دی 1393, 21:45 عصر
از زحمات شما بسیار متشکرم