مشخصات مقاله
-
1360
-
0.0
-
4013
-
0
-
0
آموزش عملیات پرس و جوی ساده LINQ
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
عملیات پرس و جو (Query) ساده ی LINQ
این مبحث توضیح مختصری درباره ی عبارت های (دستورات) Query های LINQ و نیز عملیات معمول که توسط یک Query ساده قابل اجرا می باشد، ارائه می دهد.
دسترسی به یک Data Source
در تنظیم query های LINQ اولین آیتمی که بایستی مشخص کنید، data source یا منبعی است که اطلاعات قرار است از آن واکشی شوند. در زبان C# مانند دیگر زبان های برنامه نویسی، برای استفاده از یک متغیر لازم است ابتدا آن را اعلان یا تعریف کنید. در یک کوئری LINQ، عبارت from در جایگاه اول قرار می گیرد تا منبع داده و متغیر (cust) را مشخص کند.
//queryAllCustomers is an IEnumerable
var queryAllCustomers = from cust in customers
select cust;
این متغیر مانند متغیری است که در حلقه ی foreach بکار می رود با این تفاوت که هیچ چرخش و تکرار (iteration) حقیقی داخل عبارت query رخ نمی دهد. با اجرای کوئری، متغیر به مثابه ی یک reference برای هر یک از المان های متوالی در جدول Customers ایفای نقش می کند و آن ها را تک تک داخل متغیر مزبور می ریزد. از آنجایی که کامپایلر می تواند نوع متغیر cust را تشخیص دهد، نیازی به اعلان و مشخص کردن آن به صورت صریح نیست.
نکته: برای data source های غیر جنریک نظیر ArrayList، نوع range variable بایستی به صورت صریح مشخص شود.
اعمال فیلترینگ
معمولا رایج ترین نوع عملیات در یک کوئری LINQ، اعمال فیلتر در قالب یک عبارت بولی می باشد. در واقع فیلتر سبب می شود کوئری تنها آن المان هایی را برگرداند که با عبارت بولی مشخص شده به عنوان فیلتر منطبق هستند. فیلتر را با استفاده از دستور Where تعریف می کنیم و بر اساس عبارت شرطی که در این دستور مشخص کردیم، کوئری المان های متناظر با شرط (نتایج) را برمی گردانیم. در مثال زیر، تنها مشتریانی هایی که آدرس محل زندگی آن ها در شهر لندن می باشد، در نتیجه ی کوئری لحاظ می شوند:
var queryLondonCustomers = from cust in customers
where cust.City == "London"
select cust;
همچنین می توانید عملگرهای منطقی AND و OR را برای تعریف عبارت های شرطی و اعمال فیلتر، در دستور where بکار ببرید. به عنوان مثال، برای واکشی مشتریانی که در لندن زندگی می کنند و اسم آن ها"Devon" می باشد، دستور زیر را می نویسیم:
where cust.City=="London" &&cust.Name == "Devon"
برای برگرداندن مشتری هایی که در پاریس یا لندن سکونت دارند، کد زیر را تنظیم می کنیم:
where cust.City == "London" || cust.City == "Paris"
مرتب سازی با استفاده از عبارت orderby
بد نیست داده ها را پس از استخراج از جدول، مرتب سازی کنیم. دستور orderby باعث می شود المان ها بر اساس یک مقدار ورودی مرتب شوند. برای مثال می توان نتیجه ی کوئری را بر اساس ستون Name مرتب سازی نمود. از آنجایی که مقادیر ستون Name از نوع رشته هستند، مرتب سازی بر اساس ترتیب حروف الفبا از صورت می گیرد.
var queryLondonCustomers3 =
from cust in customers
where cust.City == "London"
orderby cust.Name ascending
select cust;
برای مرتب سازی نتایج به ترتیب نزولی، عبارت orderby…descending را مورد استفاده قرار می دهیم.
گروه بندی با استفاده از دستور group ..by
دستور group به شما این امکان را می دهد تا نتایج را بر اساس کلیدی که توسط شما تعیین می شود (یک فیلد مشترک) گروه بندی کنید. به عنوان مثال، می توان کوئری را طوری تنظیم کرد که نتایج را بر اساس ستون City گروه بندی کند، بدین معنی که تمامی مشتریانی که در لندن یا پاریس زندگی می کنند در گروه های مجزا قرار بگیرند. در این مثال، cust.city همان کلید است:
// queryCustomersByCity is an IEnumerable<>
var queryCustomersByCity =
from cust in customers
group cust by cust.City;
// customerGroup is an IGrouping
foreach (var customerGroup in queryCustomersByCity)
{
Console.WriteLine(customerGroup.Key);
foreach (Customer customer in customerGroup)
{
Console.WriteLine(" {0}", customer.Name);
}
}
زمانی که کوئری خود را با یک عبارت group خاتمه دهید، نتایج شکل لیستی از لیست ها را به خود می گیرد. هر المان در لیست یک شی است که دارای یک عضو Key و لیستی از المان ها می باشد که تحت آن کلید گروه بندی شده اند. برای چرخش در یک کوئری (تکرار آن) که نتیجه ی آن شامل دنباله ای از گروه ها می باشد، بایستی از یک حلقه ی foreach تودرتو استفاده کنید. حلقه ی بیرونی هر گروه را تکرار می کند، در حالی که حلقه ی داخلی اعضای گروه را تکرار می کند. برای اشاره به نتایج هر گروه بندی، می توانید کلیدواژه ی into را در دستور بکار ببرید. با استفاده از این کلیدواژه یک شناسه ایجاد می کنید که هر گروه را بر اساس آن مرتب نموده و از آن کوئری می گیرید. دستور زیر تنها گروه هایی را برمی گرداند که بیش از دو مشتری در آن وجود دارد:
// custQuery is an IEnumerable<>
var custQuery =
from cust in customers
group cust by cust.City into custGroup
where custGroup.Count() >2
orderby custGroup.Key
select custGroup;
دستور join
عملیات join (پیوند دو جدول) درواقع یک رابطه بین داده های یک جدول با جدول دیگر ایجاد می کند. برای مثال می توان با استفاده از عملیات join تمامی مشتریان و توزیع کنندگانی که در مکان مشترک هستند (هر دو متعلق به یک شهر هستند)، را پیدا کرده و نمایش دهید. در LINQ، عبارت join همیشه بجای اینکه به طور مستقیم با جداول سروکار داشته باشد، بر روی object collection ها عملیات را انجام می دهد.
var innerJoinQuery =
from cust in customers
join dist in distributors on cust.City equals dist.City
select new { CustomerName = cust.Name, DistributorName = dist.Name };
در LINQ به اندازه ی SQL از دستور join استفاده نمی شود زیرا کلیدهای خارجی در LINQ به صورت property هایی هستند که دربردارنده ی مجموعه ای از آیتم ها می باشند (شما می توانید به کلیدهای خارجی مانند property دسترسی داشته باشید). به عنوان مثال یک شی Customer خود دربردارنده ی مجموعه ای از اشیا Order می باشد. بجای اجرای عملیات join، با استفاده از عملگر نقطه به اشیا order دسترسی پیدا می کنید:
from order in Customer.Orders...
دستور Select (تبدیل داده/Projection)
عبارت select نتایج یک کوئری را برمی گرداند و نوع هر المان که باید به عنوان خروجی بازگردانده شود را مشخص می کند. به طور مثال، می توانید تعیین کنید آیا نتیجه حاوی مجموعه ی کامل اشیا Customer باشد یا فقط یک عضو آن را شامل شود و یا زیرمجموعه و تنها برخی از اعضای مجموعه ی کامل را بر گرداند. همچنین می توانید مشخص کنید نتیجه ی کوئری بر اساس محاسبات معین یا ایجاد یک شی جدید تعیین شود. زمانی که عبارت select خروجی غیر از نمونه ی عینی از المان منبع (source element) داشته باشد، می گویم عملیات projection روی داده است. با projection می توان داده ها را تبدیل کرد.