PDA

View Full Version : آموزش: آموزش Language Integrated Query در #C



tooraj_azizi_1035
چهارشنبه 14 تیر 1391, 01:36 صبح
سلام
در این تاپیک قصد دارم LINQ رو آموزش بدم. اما باید بگم برای من سوالاتی وجود داره که می خوام از دوستان هر کسی که می تونه پاسخ بده. ضمناً ممکن است متنی رو قرار بدم که در ترجمه احتیاج به کمک داشته باشم که باز هم اهل فن لطف کنند کمک کنند تا تاپیک برای همه سودمند باشه.

مقدمه
Language-Integrated Query (LINQ) ابداعی است که در Visual Studio 2008 و .NET Framework version 3.5 منتشر شد تا شکاف میان دنیای اشیا و دنیای داده ها را پر کند. قبل از LINQ کوئری ها به شکل string های ساده بدون Type Checking در زمان کامپایل یا IntelliSense Support نوشته می شدند. علاوه بر این شما مجبور بودید زبان کوئری متفاوتی برای هر نوع از منبع داده ها بیاموزید: SQL Database ها، XML Document ها، Web Service ها و غیره.
LINQ یک کوئری را تبدیل به یک ساختار رده - اول در زبان #C یا VB میکند. شما کوئری ها را با استفاده از کلمات کلیدی زبان و عملگرهای آشنا برای کلکسیون اشیای Strongly Typed می نویسید.

مفهوم Strongly Typed:

شکل زیر یک LINQ Query که بخشی از آن کامل شده را برای یک SQL Server Database در #C با type checking کامل و Intellisense support نمایش می دهد:

http://barnamenevis.org/image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbAAAAFfCAIAAAC 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 VORK5CYII=http://i.msdn.microsoft.com/dynimg/IC28723.png

در Visual Studio می توانید LINQ Query ها را در VB یا #C برای SQL Server Database، XML Document، ADO .NET Dataset و هر کلکسیونی از اشیا که IEnumerable یا اینترقیس جنریک IEnumerable<T> را ساپورت کند بنویسید.


مقدمه ای بر LINQ query ها
یک کوئری عبارتی است که داده هایی را از یک منبع داده ها بدست می آورد. کوئری های معمولاً در یک زبان بخصوص نوشته می شوند. در طول زمان زبان های مختلفی برای انواع گوناگونی از منابع داده ها توسعه داده شده است مثل SQL برای دیتابیس ها و XQuery برای XML.

بنابراین Developer ها مجبور می شدند تا برای کار با هر نوع منبع داده ای زبان خاص آن نوع منبع داده ای را فرا بگیرند. LINQ این مسئله را با ارائه یک مدل ثابت برای کار با منابع گوناگون داده ها با فرمت های متفاوت ساده می کند. در LINQ query شما همیشه با اشیا کار می کنید.

سه بخش یک عملیات Query

همه نوع عملیات LINQ query شامل سه عمل مجزا هستند:

1. منبع داده ها را بدست بیاور.
2. Query را ایجاد کن.
3. Query را اجرا کن.

مثال زیر نشان می دهد که چطور سه بخش یک عمل کوئری در سورس بیان می شود. این مثال از یک آرایه نوع صحیح به عنوان منبع داده ها برای سهولت استفاده می کند.
با این وجود همان مفهوم برای منابع دیگر داده ها هم به کار می رود. به این مثال از قسمت های دیگر تاپیک رجوع خواهد شد.



class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;

// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}



شکل زیر کوئری را به طور کامل نشان می دهد. در LINQ اجرای کوئری از خود کوئری مجزاست. به بیان دیگر شما تنها با ایجاد کوئری داده ای را بدست نیاورده اید.

http://i.msdn.microsoft.com/dynimg/IC154187.png


منبع داده ها
در مثال قبلی چون منبع داده ها یک آرایه است، به شکل ضمنی از اینترفیس IEnumerable<T> (http://msdn.microsoft.com/en-us/library/9eekhta0.aspx) ساپورت می کند. این حقیقت بیانگر آن است که می تواند با LINQ کوئیر روی آن اجرا شود. یک کوئری با foreach اجرا می شود و foreach نیاز مند IEnumerable<T> (http://msdn.microsoft.com/en-us/library/9eekhta0.aspx) یا IEnumerable (http://msdn.microsoft.com/en-us/library/9eekhta0.aspx) است. نوع های داده ای که از IEnumerable<T> (http://msdn.microsoft.com/en-us/library/9eekhta0.aspx) پشتیبانی می کنند یا از آن مشتق می شوند مانند جنریک IQueryable<T> (http://msdn.microsoft.com/en-us/library/bb351562.aspx) نوع های داده ای queryable types نامیده می شوند.

tooraj_azizi_1035
پنج شنبه 15 تیر 1391, 13:16 عصر
یک queryable type نیاز به هیچگونه تغییر یا رفتار ویژه برای اینکه بتوان از آن به عنوان LINQ data source استفاده کرد ندارد. اگر منبع داده ها قبلاً در حافظه به عنوان یک queryable type قرار نگرفته باشد، در این صورت LINQ provider مربوطه می بایست آن را به شکل مورد نیاز در حافظه لود کند. مثلاً، LINQ to XML یک XML document را به یک queryable XElement (http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx) type لود می کند.

// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");


Query
یک کوئری مشخص می کند که چه اطلاعاتی از منبع یا منابع داده ها باید لود شود. و به طور اختیاری، مشخص می کند که چطور آن اطلاعات می بایست سورت، گروه بندی و شکل دهی شود قبل از اینکه بازگشت داده شود. یک کوئری در یک query variable ذخیره می شود و با یک query expression آماده سازی اولیه می شود. کوئری موجود در مثال قبلی تمام اعداد زوج موجود در آرایه را باز می گرداند. query expression حاوی سه گزاره است: from, where و select.

گزاره from منبع داده ها را تعیین می کند، گزاره where یک فیلتر را تعیین می کند و select نوع مقادیر بازگشتی را تعیین می کند. متغیر کوئری هیچ مقداری را بر نمی گرداند بلکه فقط اطلاعاتی را که برای تولید خروجی مورد نیاز است را برای بعدها که کوئری اجرا خواهد شد در خود نگهداری می کند.

اجرای کوئری
اجرای تاخیری
همانطور که پیشتر گفته شد، query variable به خودی خود تنها دستورات کوئری را نگهداری می کند. اجرای واقعی کوئری به زمانی که شما روی عناصر خروجی با دستور foreach عمل iteration را انجام می دهید به تعویق می افتد.

این مفهوم اجرای تعویقی یا deferred execution نامیده می شود و در مثال زیر نمایش داده شده است:


// Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}


دستور foreach همچنین جایی است که نتایج کوئری بازیافت می شود. به عنوان مثال در مثال قبلی متغیر تکرار یعنی num هر مقدار را در توالی بازگشتی نگهداری می کند (هر بار یکی).

چون query variable خودش هر گز نتایج را نگه نمی دارد، هر گاه که بخواهید می توانید آن را اجرا نمائید. مثلاً ممکن است دیتابیسی داشته باشید که دائماً توسط یک برنامه جداگانه به روز شود. شما در برنامه تان می توانید یک کوئری که آخرین داده ها را به دست می آورد را اجرا و به کرار آن را در بازه زمانی خاصی اجرا و در هر بار اجرا نتایج متفاوتی بدست آورید.

ادامه دارد..
.

tooraj_azizi_1035
پنج شنبه 15 تیر 1391, 15:56 عصر
دوستان مطمئن هستم که در درک مطالب گفته شده ابهام دارید اما برای خود من هم ابهام وجود دارد و سعی خواهم کرد این ابهامات را مطرح و از اساتید در جهت رفع آن کمک بگیرم.



ادامه LINQ

با کمک LINQ to SQL، شما ابتدا یکobject-relational mapping در زمان طراحی به روش دستی یا با استفاده از O/R Designer ایجاد می کنید. شما کوئری هایتان را برای اشیا می نویسید و در زمان اجرا LINQ to SQL ارتباط با دیتابیس را مدیریت می کند. در مثال زیر، Customer بیانگر یک جدول خاص در دیتابیس است و Table<Customer> جنریک IQueryable<T> که از IEnumerable<T> مشتق می شود را ساپورت می کند.


Northwnd db = new Northwnd(@"c:\northwnd.mdf");

// Query for customers in London.
IQueryable<Customer> custQuery =
from cust in db.Customers
where cust.City == "London"
select cust;






· توجه

نوع های داده ای مانند ArrayList که اینترفیس غیر جنریک IEnumerable را ساپورت می کنند نیز می توانند در LINQ به عنوان منبع داده ها استفاده شود.

تحمیل اجرای فوری

کوئری هایی که توابع تجمعی را روی عناصر منبع داده ای اجرا می کنند ابتدا می بایست روی آن عناصر عمل iteration (یعنی مرور تک تک عنصر) را انجام دهند. مثال هایی از کوئری های از این دست عبارتند از Count، Max، Average و First. این کوئری ها بدون نیاز به یک foreach علنی اجرا می شوند چون خود کوئری می بایست ابتدا برای بازگرداندن نتیجه از foreach استفاده کند. همچنین توجه داشته باشید که این نوع از کوئری ها یک تک مقدار باز می گردانند نه یک کلکسیون IEnumerable. کوئری زیر تعداد اعداد زوج موجو در آرایه منبع را باز می گرداند.

var evenNumQuery =
from num in numbers
where (num % 2) == 0
select num;

int evenNumCount = evenNumQuery.Count();



برای تحمیل اجرای فوری هر نوع کوئری و cache نتایجش متدهای ToList<TSource> و ToArray<TSource> را فراخوانی نمائید

همچنین می توانید اجرا را با قرار دادن بلافاصله حلقه foreach بعد از عبارت کوئری تحمیل نمائید. با این وجود با فراخوانی ToList و ToArray شما همچنین تمام داده های موجود در یک شیء کلکسیون را cache می کنید.


List<int> numQuery2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();

// or like this:
// numQuery3 is still an int[]

var numQuery3 =
(from num in numbers
where (num % 2) == 0
select num).ToArray();



LINQ و Generic Type ها

LINQ Query ها بر پایه نوع های جنریک که در .NET Framework نسخه 2.0 منتشر شدند هستند. شما نیازی به داشتن دانش عمیق نسبت به جنریک ها قبل از اینکه بخواهید کوئری بنویسید ندارید. با این وجود باید دو مفهوم را درک کنید:

1. وقتی یک نمونه از روی یک generic collection class مانند List<T> ایجاد می کنید، شما به جای T ، نوع اشیایی که لیست نگه خواهد داشت جایگزین را می کنید. به طور مثال لیستی از رشته ها به شکل List<string> بیان می شود و لیستی از اشیای Customer به شکل List<Customer> بیان می گردد. یک لیست جنریک strongly typed است و مزایای زیادی برای کلکسیون هایی که عناصرشان را به عنوان شیء نگه می دارند دارد. اگر شما سعی کنید که شیئی مانند Customer را به List<string> اضافه کنید، در زمان کامپایل خطا بوجود می آید. استفاده از کلکسیون های جنریک آسان است چون نیازی ندارید تا run-time type-casting انجام دهید.

2. IEnumerable<T> اینترفیسی است که به generic collection class ها امکان می دهد تا توسط دستور foreach مرور یا enumerate شوند. generic collection class ها IEnumerable<T> را دقیقاً مانند ArrayList و IEnumerable ساپورت می کنند.
متغیر های IEnumerable<T> در LINQ Query ها


نوع متغیر های LINQ Query به IEnumerable<T> یا به نوع مشتق شده ای مثل IQueryable<T> ست می شود. وقتی یک متغیر Query می بینید که به IEnumerable<Customer> ست شده است، این بدین معنی است که وقتی کوئری اجرا می شود، خروجی تعداد صفر یا بیشتری از اشیای Customer است.




IEnumerable<Customer> customerQuery =
from cust in customers
where cust.City == "London"
select cust;

foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}



اجازه به کامپایلر برای مدیریت اعلان نوع های جنریک

اگر ترجیح می دهید، میتوانید از سینتکس جنریک با استفاده از کلمه کلیدی var اجتناب نمائید. کلمه کلیدی var به کامپایلر اجازه می دهد تا نوع یک متغیر کوئری را با نگاه به منبع داده ها که در گزاره from مشخص شده استنباط کند. مثال زیر همان کد کامپایل شده مثال قبلی را تولید می کند:

var customerQuery2 =
from cust in customers
where cust.City == "London"
select cust;

foreach(var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}



کلمه کلیدی var بویژه زمانی مفید است که که نوع متغیر واضح است یا وقتی که مشخص کردن نوع های جنریک تو در تو (Nested generic types) مانند آنهایی که توسط کوئری های گروهی، آنقدر ها بااهمیت نیست.

در کل، توصیه میکنیم که اگر از کلمه کلیدی var استفاده میکنید، بدانید که می تواند کد شما را برای خواندن توسط دیگران سخت تر کند.
عملیات پایه Linq Query
بدست آوردن منبع داده ها

در یک LINQ Query، گام نخست مشخص کردن منبع داده هاست. در C#‎‎‎‎‎ و همانطور که در اکثر زبان ها اینگونه است، یک متغیر می بایست ابتدا قبل از آنکه استفاده شود اعلان شود. در یک LINQ Query، گزاره from در ابتدا قرار می گیرد تا منبع داد ها تولید شود و سپس متغیر range (cust) قرار می گیرد:


//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
select cust;


متغیر range، شبیه متغیر iteration در یک حلقه foreach است با این تفاوت که هیچگونه iteration واقعی در یک عبارت کوئری رخ نمی دهد. وقتی کوئری اجرا می شود، متغیر Range به عنوان ارجاعی به هر عنصر بعدی در customers به کار خواهد رفت.

چون کامپایلر می تواند نوع cust را استنباط کند، مجبور نیستید نوعش را علناً مشخص کنید. متغیر های Range اضافی می توانند با گزاره let تولید شوند.


· توجه

برای منابع داده ای غیر جنریک مانند ArrayList، متغیر Range می بایست علناً نوعش مشخص شود.

Filtering

احتمالاً رایج ترین عملگر کوئری استعمال یک فیلتر به فرم عبارت Boolean است. فیلتر باعث می شود کوئری تنها آن عناصری را که عبارت در مورد آنها صدق می کند را برگرداند. نتیجه با استفاده از گزاره where تولید می شود. فیلتر همچنین مشخص می کند چه عناصری باید از توالی منبع داده ها کنار گذاشته شود در مثال زیر، تنها مشتریانی که آدرسشان در لندن است بازگردانده می شوند



var customerQuery2 =
from cust in customers
where cust.City == "London"
select cust;

foreach(var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

samadblaj
پنج شنبه 15 تیر 1391, 20:38 عصر
سلام دوست عزیز تورج جان ممنونم از مقاله بسیار خوبت امروز داشتم دقیقا همین مقاله رو در توی MSDN مطالعه میکردم که پیچیدگی بعضی از واژه ها باعث میشد دشت از مطالعه بکشم... .

همینطور کمبود همچین مقالاتی در منابع فارسی.

امیدوارم همچنان به این روند رو به رشدت ادامه بدی.

tooraj_azizi_1035
جمعه 16 تیر 1391, 12:48 عصر
من می خوام هر کس هر جمله ای رو که متوجه نمیشه معادل انگلیسی اش رو قرار بدم تا رو ترجمه روانش بحث بشه تا همه در رفع مشکل کمک کنند ما که یک تنه نمی تونیم از پس هر متنی بر بیاییم.

tooraj_azizi_1035
جمعه 16 تیر 1391, 13:11 عصر
Data Transformations در LINQ

LINQ تنها برای بدست آوردن داده ها به کار نمی رود. LINQ همچنین یک ابزار قدرتمند برای تبدیل داده ها است. با استفاده از یک LINQ Query شما می توانید توالی منبع داده ها را به عنوان ورودی دریافت و به روش های متنوعی آن را تغییر و توالی خروجی جدیدی را بوجود آورید.
شما می توانید خود توالی منبع داده ها (source sequence) را بدون تغییر خود عناصر تشکیل دهنده با عملیات sorting و grouping تغییر دهید. اما شاید قدرتمندترین قابلیت LINQ Query ها توان ایجاد نواع های جدید است.
این کار با گزاره select انجام می شود. به طور مثال شما می توانید این کارها را انجام دهید:

دو اصطلاح:
input sequence : یعنی توالی ورودی یا همان داده های ورودی که قرار است کوئری روی آن اجرا شود.
output sequence: یعنی توالی خروجی یا به بیان ساده تر همان خروجی تولید شده توسط کوئری LINQ.


چندین input sequence را به یک output sequence که دارای نوع داده ای جدید است تبدیل کنید.
output sequence هایی تولید کنید که عناصر آنها تنها حاوی یک یا چندین خصیصه از هر عنصر موجود در توالی منبع داده ها (source sequence)است.
output sequence هایی تولید کنید که عناصر آنها را نتایج عملیات اجرا شده روی منبع داده ها تشکیل می دهد.
output sequence هایی با فرمت های متفاوت تولید کنید. مثلاً شما می توانید داده ها را از ردیف های داده ای SQL یا فایل های متنی به XML تبدیل کنید.


اظهار لطف یکی از مدیران بخش سی شارپ ( salehbagheri (http://barnamenevis.org/member.php?39960-salehbagheri) )در لینک زیر باعث شد ما ترمز دستی رو بکشیم خدا یارو نگهدار همه دوستان!

http://barnamenevis.org/showthread.php?349293-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D9%86%DB%8C%D8%AF-%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%D8%A8%D8%AE%D8%B4-%D9%87%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B2-MSDN-%28%D8%AC%D8%AF%DB%8C%D8%AF!%29/page2 (http://barnamenevis.org/showthread.php?349293-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D9%86%DB%8C%D8%AF-%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%D8%A8%D8%AE%D8%B4-%D9%87%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B2-MSDN-%28%D8%AC%D8%AF%DB%8C%D8%AF%21%29/page2)

alias136790
سه شنبه 27 فروردین 1392, 22:58 عصر
یه سؤال
من قبلا از LinqtoSql استفاده کردم. حالا میشه از Linq تو SQLCE استفاده کرد؟
یه خوبی که لینک داره اینه که دستورات خیلی ساده و قابل فهم هستن، و دست آدم برای نوشتن کوئری خیلی بازه، حتی راحتتر از نوشتن کوئری تو SQL.