<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های محمد مهدی آتش برگ</title><link>https://virgool.ir/feed/@mwwhdi_80</link><description>دانشجوی نرم افزار دانشکده شهید شمسی پور</description><language>fa</language><pubDate>2026-11-11 07:37:46</pubDate><image><url>https://virgool.ir/images/default-avatar.jpg</url><title>محمد مهدی آتش برگ</title><link>https://virgool.ir/@mwwhdi_80</link></image><item><title>عبارات جستجو در #C</title><link>https://virgool.ir/@mwwhdi_80/عبارات-جستجو-در-c-bll7fh4bh3bq</link><description>بسم الله الرحمن الرحیماصول عبارات جست و جواین مقاله مفاهیم اساسی مربوط به عبارات جست و جو در زبان سی شارپ(C#) را بیان میکند.امیدوارم توانسته باشم با ترجمه بهینه به شما در فهم این مقاله کمک کرده باشم.پرس و جو چیست و چه کاری انجام می دهد؟پرس و جو مجموعه ای از دستورالعمل ها است که توصیف می کند چه داده هایی را از یک منبع داده ارائه شده (یا منابع داده) بازیابی می کند و داده های برگشتی باید دارای چه شکل و ساختاری باشند. پرس و جو از نتایجی که ایجاد می کند متمایز است. به طور کلی ، داده های منبع به طور منطقی به عنوان دنباله ای از عناصر از همان نوع سازماندهی می شوند.به عنوان مثال ، جدول پایگاه داده SQLشامل دنباله ای از ردیف ها(rows) است. در یک فایل XML ، &#34;دنباله ای&#34; از عناصر XMLوجود دارد (اگرچه اینها به صورت سلسله مراتبی در یک ساختار درختی سازمان یافته اند). مجموعه ای در حافظه شامل دنباله ای از اشیا است.از نظر یک برنامه ، نوع خاص و ساختار داده های منبع اصلی مهم نیست. این برنامه همیشه داده های منبع را به عنوان مجموعه ای با تعداد IEnumerable &lt;T&gt;یاIQueryable &lt;T&gt;مشاهده می کند. به عنوان مثال ، در LINQ به XML، داده های منبع به عنوان یک &lt;XElement&gt; قابل شمارش قابل مشاهده است.با توجه به این توالی منبع ، یک پرس و جو ممکن است یکی از سه کار را انجام دهد:· زیر مجموعه ای از عناصر را بازیابی کند تا یک توالی جدید بدون تغییر در عناصر منفرد تولید کند.پس از آن پرس و جو ممکن است توالی برگردانده شده را به روشهای مختلف مرتب یا گروه بندی کند ، همانطور که در مثال زیر نشان داده شده است:IEnumerable&lt;string&gt; highScoresQuery2 =from score in scoreswhere score &gt; 80orderby score descendingselect $&#34;The score is {score}&#34;· دنباله ای از عناصر را مانند مثال قبلی بازیابی کند اما آنها را به نوع جدیدی از شی تبدیل کند.به عنوان مثال ، یک پرس و جو ممکن است فقط نام خانوادگی برخی از سوابق مشتری را در یک منبع داده بازیابی کند. یا ممکن است قبل از ایجاد توالی نتیجه نهایی ، رکورد کامل را بازیابی کرده و سپس از آن برای ساخت نوع دیگری از نوع حافظه در حافظه یا حتی داده های XMLاستفاده کند. مثال زیر یک فرافکنی از یک intبه یک string  را نشان می دهد. به نوع جدید highScoresQuerتوجه کنید.IEnumerable&lt;string&gt; highScoresQuery2 =from score in scoreswhere score &gt; 80orderby score descendingselect $&#34;The score is {score}&#34;· مقدار یگانه را در مورد داده های منبع بازیابی کند ، مانند:1. تعداد عناصری که با یک شرایط خاص مطابقت دارند.2. عنصری که بیشترین یا کمترین مقدار را داشته باشد.3. اولین عنصری که با یک شرط یا مجموع مقادیر خاص در یک مجموعه مشخص از عناصر مطابقت دارد.به عنوان مثال ، پرس و جو زیر تعداد نمرات بزرگتر از 80 از آرایه صحیح امتیازات را برمی گرداند:int highScoreCount =( from score in scoreswhere score &gt; 80select score).Count();در مثال قبلی ، به استفاده از پرانتز در اطراف عبارت کوئری قبل از فراخوانی به روش Countتوجه داشته باشید. همچنین می توانید با استفاده از یک متغیر جدید ، نتیجه را بیان کنید. این تکنیک بیشتر خوانا است زیرا متغیری را که پرس و جو را ذخیره می کند از را از متغیر جستجوی ذخیره کننده نتیجه جدا نگه می دارد.IEnumerable&lt;int&gt; highScoresQuery3 =from score in scoreswhere score &gt; 80select score;int scoreCount = highScoresQuery3.Count();در مثال قبلی ، پرس و جو در فراخوانی Count انجام می شود ، زیرا Count برای تعیین تعداد عناصر برگشتی توسط highScoresQuery، باید نتایج را تکرار کند.عبارت پرس و جو(کوئری) چیست؟عبارت queryعبارتی است از پرس و جو(کوئری) که به نحو پرس و جو بیان می شود. عبارت query یک ساختار زبان درجه یک است. این عبارت دقیقاً مانند هر عبارت دیگر است و می تواند در هر زمینه ای که بیان C # معتبر باشد استفاده شود. عبارت queryمتشکل از مجموعه ای از بندها است که در یک نحو اعلانی شبیه SQL یا XQuery نوشته شده است. هر بند به نوبه خود حاوی یک یا چند عبارت C # است ، و این عبارات ممکن است به نوبه خود عبارت جستجو باشند یا دارای عبارت پرسشی باشند.یک عبارت جستجو باید با کلمه کلیدی from  آغاز شود و با کلمه کلیدی selectیا group پایان یابد.بین from  و select  یا group،می تواند شامل یک یا چند کلمه کلیدی اختتیاری دیگر باید:where،orderby،joinو حتی from  اضافی. همچنین می توانید از کلمه کلیدی intoاستفاده کنید تا نتیجه یک جمله عضویت یا گروه را فعال کند تا به عنوان منبع عبارات پرس و جو اضافی در همان عبارت پرسش استفاده شود.متغیر پرس و جودر LINQ، متغیر پرس و جو به هر متغیری گفته می شود که به جای نتایج پرس و جو ، کوئری را ذخیره می کند. به طور خاص ، یک متغیر query همیشه یک نوع قابل شمارش است که توالی عناصر را هنگامی که در یک عبارت foreach یا یک تماس مستقیم به IEnumerator.MoveNextآن تکرار می شود ، تولید می کند.مثال کد زیر یک عبارت جستجوی ساده با یک منبع داده ، یک بند فیلتر ، یک بند مرتب سازی و بدون تغییر عناصر منبع را نشان می دهد. بند انتخاب عبارت را به پایان می رساند.static void Main(){// Data source.int[] scores = { 90, 71, 82, 93, 75, 82 };// Query Expression.IEnumerable&lt;int&gt; scoreQuery = //query variablefrom score in scores //requiredwhere score &gt; 80 // optionalorderby score descending // optionalselect score; //must end with select or group// Execute the query to produce the resultsforeach (int testScore in scoreQuery){Console.WriteLine(testScore);}}// Outputs: 93 90 82 82در مثال قبلی ، scoreQuery یک متغیر پرس و جو است که از آن بعضا فقط به عنوان یک پرس و جو یاد می شود. متغیر پرس و جو هیچ داده نتیجه واقعی را که در حلقه foreach تولید می شود ، ذخیره نمی کند. و هنگامی که دستور foreach اجرا می شود ، نتایج جستجو از طریق متغیر query scoreQueryبر نمی گردد. بلکه از طریق متغیر تکرار testScore بازگردانده می شوند متغیر scoreQueryرا می توان در حلقه دوم foreach تکرار کرد. تا زمانی که نه خود و نه منبع داده اصلاح نشده باشد ، نتایج یکسانی را ایجاد می کند. یک متغیر query ممکن است یک queryرا که با نحو query یا syntaxمتد یا ترکیبی از این دو بیان می شود ، ذخیره کند. در مثال های زیر ، queryMajorCitiesو queryMajorCities2 متغیرهای queryهستند://Query syntaxIEnumerable&lt;City&gt; queryMajorCities =from city in citieswhere city.Population &gt; 100000select city;// Method-based syntaxIEnumerable&lt;City&gt; queryMajorCities2 = cities.Where(c =&gt; c.Population &gt; 100000);از طرف دیگر ، دو مثال زیر متغیرهایی را نشان می دهد که متغیرهای پرس و جو نیستند حتی اگر هرکدام با یک پرس و جو شروع می شوند. آنها متغیرهای جستجو نیستند زیرا نتایج را ذخیره می کنند:int highestScore =(from score in scoresselect score).Max();// or split the expressionIEnumerable&lt;int&gt; scoreQuery =from score in scoresselect score;int highScore = scoreQuery.Max();// the following returns the same resultint highScore = scores.Max();List&lt;City&gt; largeCitiesList =(from country in countriesfrom city in country.Citieswhere city.Population &gt; 10000select city).ToList();// or split the expressionIEnumerable&lt;City&gt; largeCitiesQuery =from country in countriesfrom city in country.Citieswhere city.Population &gt; 10000select city;List&lt;City&gt; largeCitiesList2 = largeCitiesQuery.ToList();تایپ صریح و ضمنی متغیرهای پرس و جواین مستندات معمولاً نوع مشخص متغیر پرس و جو را نشان می دهد تا رابطه نوع بین متغیر پرس و جو و بند انتخاب را نشان دهد. با این حال ، می توانید از کلمه کلیدی varنیز استفاده کنید تا به کامپایلر دستور دهد نوع متغیر پرس و جو (یا هر متغیر محلی دیگر) را در زمان کامپایل استنباط کند. به عنوان مثال ، نمونه کوئری که قبلاً در این مبحث نشان داده شده است نیز می تواند با استفاده از تایپ ضمنی بیان شود:// Use of var is optional here and in all queries.// queryCities is an IEnumerable&lt;City&gt; just as// when it is explicitly typed.var queryCities =from city in citieswhere city.Population &gt; 100000select city;شروع یک عبارت پرس و جویک عبارت پرس و جو باید با یک جمله از from شروع شود. این یک منبع داده همراه با یک متغیر دامنه را مشخص می کند. متغیر دامنه نشانگر هر عنصر پی در پی در توالی منبع است زیرا توالی منبع در حال عبور است. متغیر دامنه بر اساس نوع عناصر موجود در منبع داده به شدت تایپ می شود. در مثال زیر ، از آنجا که کشورها آرایه ای از اشیا Country کشور هستند ، متغیر دامنه نیز به عنوان Country تایپ می شود. از آنجا که متغیر محدوده به شدت تایپ شده است ، می توانید از اپراتور نقطه برای دسترسی به اعضای موجود از نوع استفاده کنید.IEnumerable&lt;Country&gt; countryAreaQuery =from country in countrieswhere country.Area &gt; 500000 //sq kmselect country;متغیر محدوده در دامنه است تا زمانی که پرس و جو یا با یک علامت ویرگول یا با یک جمله ادامه پیدا کند.یک عبارت جستجو ممکن است شامل چندین جمله باشد. وقتی هر عنصر در توالی منبع خود یک مجموعه است یا شامل یک مجموعه است ، از جمله های اضافی استفاده کنید. به عنوان مثال ، فرض کنید شما مجموعه ای از اشیا کشور دارید ، که هر کدام شامل مجموعه ای از اشیا City شهر به نام شهرها هستند. برای پرس و جو از اشیا Cityشهر در هر کشور ، از دو جمله استفاده کنید که در اینجا نشان داده شده است:IEnumerable&lt;City&gt; cityQuery =from country in countriesfrom city in country.Citieswhere city.Population &gt; 10000select city;پایان دادن به یک عبارت جستجویک عبارت جستجو باید با یک  groupیا یک select  پایان یابد.عبارت groupاز کلمه group برای تولید دنباله ای از گروه های سازمان یافته توسط کلیدی که تعیین کرده اید استفاده کنید. کلید می تواند هر نوع داده باشد. به عنوان مثال ، پرس و جو زیر دنباله ای از گروه ها را ایجاد می کند که شامل یک یا چند شی Countryاست و کلید آنها مقدار char است.var queryCountryGroups =from country in countriesgroup country by country.Name[0];عبارت selectاز selectبرای تولید انواع دیگر توالی ها استفاده کنید. یک selectساده فقط دنباله ای از همان نوع اشیا را که اشیا موجود در منبع داده هستند ، تولید می کند. . در این مثال ، منبع داده شامل اشیا objects کشور است. بند سفارش فقط عناصر را به ترتیب جدید طبقه بندی می کند و بند انتخاب دنباله ای از اشیا Country مرتب شده کشور را تولید می کند.IEnumerable&lt;Country&gt; sortedQuery =from country in countriesorderby country.Areaselect country;از selectمی توان برای تبدیل داده های منبع به توالی انواع جدید استفاده کرد. این تحول همچنین فرافکنی نامگذاری شده است. در مثال زیر ، selectدنباله ای از انواع ناشناس را نمایش می دهد که فقط شامل زیر مجموعه ای از فیلدها در عنصر اصلی است. توجه داشته باشید که اشیاء جدید با استفاده از یک راه انداز شیء اولیه شده است.// Here var is required because the query// produces an anonymous type.var queryNameAndPop =from country in countriesselect new { Name = country.Name, Pop = country.Population };ادامه با &#34;INTO&#34;می توانید از کلمه کلیدی into در یک select یاgroup استفاده کنید تا یک شناسه موقت ایجاد کنید که یک عبارت جستجو را ذخیره می کند. این کار را هنگامی انجام می دهید که پس از انجام گروه بندی یا انتخاب عملیات کوئری اضافی را باید روی یک پرس و جو انجام دهید. در مثال زیر کشورها بر اساس جمعیت در محدوده 10 میلیون نفر دسته بندی شده اند. بعد از ایجاد این گروه ها ، بندهای اضافی برخی از گروه ها را فیلتر کرده و سپس گروه ها را به ترتیب صعودی مرتب می کند. برای انجام آن عملیات اضافی ، ادامه ارائه شده توسط countryGroupلازم است.// percentileQuery is an IEnumerable&lt;IGrouping&lt;int, Country&gt;&gt;var percentileQuery =from country in countrieslet percentile = (int) country.Population / 10_000_000group country by percentile into countryGroupwhere countryGroup.Key &gt;= 20orderby countryGroup.Keyselect countryGroup;// grouping is an IGrouping&lt;int, Country&gt;foreach (var grouping in percentileQuery){Console.WriteLine(grouping.Key);foreach (var country in grouping)Console.WriteLine(country.Name + &#34;:&#34; + country.Population);}Filtering, ordering, and joiningبین بند شروع و بند پایان، تمام بندهای دیگر (where, join, orderby, from, let) اختیاری هستند. هر یک از بندهای اختیاری ممکن است صفر یا چند بار در متن جستجو استفاده شود.whereclauseاز بند Where برای فیلتر کردن عناصر از داده های منبع بر اساس یک یا چند اصطلاحات اصلی استفاده کنید. بند Whereدر مثال زیر یک محمول دارد با دو شرط.IEnumerable&lt;City&gt; queryCityPop =from city in citieswhere city.Population &lt; 200000 &amp;&amp; city.Population &gt; 100000select city;orderby clauseبرای مرتب سازی نتایج به ترتیب صعودی یا نزولی از order byاستفاده کنید. شما همچنین می توانید مرتب سازی ثانویه را مشخص کنید. مثال زیر با استفاده از خاصیت Area، مرتب سازی اولیه را روی اشیا country کشور انجام می دهد. سپس مرتب سازی ثانویه را با استفاده از ویژگی Populationانجام می دهد.IEnumerable&lt;Country&gt; querySortedCountries =from country in countriesorderby country.Area, country.Population descendingselect country;کلمه کلیدی ascendingاختیاری است. اگر نظمی مشخص نشود ، این ترتیب مرتب سازی پیش فرض است.join clauseبرای پیوند دادن و / یا ترکیب عناصر از یک منبع داده با عناصر از منبع داده دیگر بر اساس مقایسه برابری بین کلیدهای مشخص شده در هر عنصر ، از دستور join استفاده کنید. در LINQ ، عملیات پیوستن بر روی توالی اشیایی که عناصر آنها انواع مختلفی دارند ، انجام می شود.بعد از اینکه  دو دنباله را  پیوند دادید ، باید از یک عبارت select یا group استفاده کنید تا مشخص شود کدام عنصر در دنباله خروجی ذخیره شود. همچنین می توانید از یک نوع ناشناس برای ترکیب خصوصیات از هر مجموعه عنصر مرتبط در یک نوع جدید برای دنباله خروجی استفاده کنید. مثال زیر اشیا prod را که ویژگی Category با یکی از دسته های آرایه رشته های دسته ها مطابقت دارد مرتبط می کند. محصولاتی که دسته آنها با هیچ رشته ای در دسته ها مطابقت ندارد فیلتر می شوند. دستور Select نوع جدیدی را طراحی می کند که خصوصیات آن از catو از محصول گرفته شده است.var categoryQuery =from cat in categoriesjoin prod in products on cat equals prod.Categoryselect new { Category = cat, Name = prod.Name };همچنین می توانید با استفاده از کلمه کلیدی into ، پیوستن گروهی را با ذخیره نتایج عملیات joinدر یک متغیر موقت انجام دهید.let clauseازletبرای ذخیره نتیجه یک عبارت ، مانند یک فراخوانی متد ، در یک متغیر محدوده جدید استفاده کنید. در مثال زیر ، متغیر range اولین عنصر از آرایه رشته ها را که توسط .letfirstNameSplit بازگردانده می شود ، ذخیره می کند.string[] names = { &#34;Svetlana Omelchenko&#34;, &#34;Claire O&#39;Donnell&#34;, &#34;Sven Mortensen&#34;, &#34;Cesar Garcia&#34; };IEnumerable&lt;string&gt; queryFirstNames =from name in nameslet firstName = name.Split(&#39; &#39;)[0]select firstName;foreach (string s in queryFirstNames)Console.Write(s + &#34; &#34;);//Output: Svetlana Claire Sven Cesarزیر سوال(subquery) در یک عبارت پرس و جویک عبارت پرس و جو ممکن است خود شامل یک عبارت پرس و جو باشد که از آن بعضاً به عنوان زیر سوال نیز یاد می شود. هر زیر پرس و جو با بند مخصوص خود شروع می شود که لزوماً به همان منبع داده در بند اول اشاره نمی کند. به عنوان مثال ، پرس و جو زیر عبارت کوئری را نشان می دهد که در عبارت select برای بازیابی نتایج یک عملیات گروه بندی استفاده می شود.var queryGroupMax =from student in studentsgroup student by student.GradeLevel into studentGroupselect new{Level = studentGroup.Key,HighestScore =(from student2 in studentGroupselect student2.Scores.Average()).Max()};با تشکر از شما که وقت ارزشمند خود را در اختیار بنده قرار دادید.لینک مقاله زبان اصلی:Query expression basics (LINQ in C#) | Microsoft Docs</description><category>محمد مهدی آتش برگ</category><author>محمد مهدی آتش برگ</author><pubDate>Tue, 06 Apr 2021 15:33:22 +0430</pubDate></item></channel></rss>