PDA

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



zkazemi
جمعه 16 مرداد 1388, 18:01 عصر
سینتکس کوئری در مقابل سینتکس متد(Query syntax versus method syntax)
LINQ Provider امکان نوشتن کوئری ها را با استفاده از هردو سینتکس متد و کوئری فراهم می کند. بیشتر مثال هایی که تاکنون گفته شده است از سینتکس کوئری استفاده کرده اند. به مثال زیر توجه کنید:



IEnumerable<string> query =
from c in contact
where c.FirstName.StartsWith("S")


select c;


تعریف ، خواندن و درک کردن این نوع سینتکس بسیار راحته . وقتی یک کوئری LINQ کامپایل می شود ، عبارت کوئری به سینتکس متد ترجمه می شود. چراکه زبان CLRواقعا سینتکس کوئری را درک نمی کنه . بنابر این در زمان اجرا عبارت کوئری به متد که برای CLR قابل فهم است ترجمه می شود.
در زیر یک مثال از سینتکس کوئری آورده شده است:



IEnumerable<string> query =
from c in contact
where c.FirstName.StartsWith("S")
&& c.LastName.StartsWith("A")
Orderby c.LastName


select c;



همین کد با سینتکس متد به صورت زیر است :



IEnumerable<string> query = contact.Where(c => c.FirstName.StartsWith("S")


&& c.LastName.StartsWith("A")).OrderBy(c => c.LastName);


حالا این سوال مطرح می شود که کدام یک از سینتکس هاباید مورد استفاده قرار بگیرد. زمانی که خوانی و فهم کد برای شما مهم باشد بهتر است از سینتکس کوئری استفاده کنید. اما ممکن است این سینتکس برای مقاصد ما کافی نباشد . در زیر چند دلیل برای اینکه ممکن است سینتکس کوئری انتخاب مناسبی نباشد آورده شده است:
1- همه عملگر های کوئری استاندار در سینتکس کوئری وجود ندارند.
2- همه ترکیبات از عملگر های کوئری استاندارد در سینتکس کوئری فعال نیستند.
3- در بعضی موارد استفاده از سینتکس متد خواناتر از سینتکس کوئری است.
استفاده از سینتکس کوئری و متد در عمل
ابتدا یک پروژه از نوع ویندوز ایجاد کنید. سپس Solution Explorer را باز کرده و در شاخه Refrences دو فضای نام System.Data و System.Data.Linq را اضافه کنید.سپس فرم را در حالت طراحی باز کرده و سه دکمه و یک لیست باکس به فرم اضافه کنید.

کنترل
نام
خاصیت Text
دکمه اول
cmdQuerySyntax
Query Syntax
دکمه دوم
cmdMethodSyntax
Method Syntax
دکمه سوم
cmdClose
Close
لیست باکس



سپس در زیر کلاس Frorm کد های زیر را وارد نمایید:



public class Contact
{
private string Title;
private string FirstName;
private string MiddleName;
private string LastName;
private string EmailAddress;
private int EmailPromotion;
public string title
{
get { return Title;}
set { Title = value; }
}
public string firstName
{
get { return FirstName; }
set { FirstName = value; }
}
public string middleName
{
get { return MiddleName; }
set { MiddleName = value; }
}
public string lastName
{
get { return LastName; }
set { LastName = value; }
}
public string emailAddress
{
get { return EmailAddress; }
set { EmailAddress = value; }
}
public int emailPromotion
{
get { return EmailPromotion; }
set { EmailPromotion = value; }
}


}


بر روی دکمه Close دابل کلیک کنید و کد زیر را در داخل رویداد کلیک آن وارد نمایید:


Application.Exit();

بر روی دکمه Query Method دابل کلیک کنید و کد زیر را در داخل رویداد کلیک آن وارد نمایید:




List<Contact> contact = new List<Contact> {
new Contact() {title="developer",firstName="zahra",middleName=" -e",lastName="kazemi",emailAddress="zkdrc_kazemi@yahoo.com",emailPromotion=1},
new Contact(){title="programmer",firstName="ashkan",middleName="-b",lastName="karimi",emailAddress="ashkaan_karimi@yahoo.com",emailPromotion=2},
new Contact() {title="electeronical",firstName="farhad",middleName="-c",lastName="ramtin",emailAddress="farhadramtinram@yahoo.com",emailPromotion=1}
};
var query =
from c in contact
where c.firstName.StartsWith("z")
&& c.lastName.StartsWith("k")
orderby c.lastName
select c;
foreach (var item in query)
listBox1.Items.Add(item.firstName + " " + item.lastName + " " +
item.emailAddress);