فصل 26 از 40 درس 1 از 1

LINQ

LINQ

بخشی از آموزش جامع C# و .NET 10

محتوای درس LINQ

LINQ یک مدل یکپارچه برای Query روی Collectionها و منابع داده ارائه می‌کند. خوانایی Query، Deferred Execution و انتخاب Operator مناسب از نکات کلیدی استفاده حرفه‌ای از LINQ هستند.

۱. Where و Select

Where فیلتر و Select Projection انجام می‌دهد. بهتر است هر مرحله هدف روشن و قابل خواندن داشته باشد.

مثال

var r=new[]{1,2,3,4}.Where(x=>x%2==0).Select(x=>x*10);
         Console.WriteLine(string.Join(",",r));

در این مثال، مفهوم «Where و Select» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. Ordering

OrderBy و ThenBy ترتیب چندسطحی ایجاد می‌کنند و نسخه Descending برای جهت نزولی است.

مثال

var r=new[]{3,1,2}.OrderBy(x=>x);
         Console.WriteLine(string.Join(",",r));

در این مثال، مفهوم «Ordering» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. Element Operators

First، FirstOrDefault، Single و SingleOrDefault semantics متفاوتی دارند و باید متناسب با انتظار تعداد نتایج انتخاب شوند.

مثال

int first=new[]{10,20}.First();
         bool any=new[]{1,2}.Any(x=>x>1);

در این مثال، مفهوم «Element Operators» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. Aggregation

Count، Sum، Average، Min و Max عملیات تجمیعی رایج هستند.

مثال

int sum=new[]{1,2,3}.Sum();
         double avg=new[]{1,2,3}.Average();

در این مثال، مفهوم «Aggregation» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. GroupBy و Join

GroupBy داده را بر اساس Key گروه‌بندی و Join رابطه میان دو Sequence را بر اساس Key ایجاد می‌کند.

مثال

var g=new[]{"ali","amir","sara"}.GroupBy(x=>x[0]);
         foreach(var x in g) Console.WriteLine(x.Key);

در این مثال، مفهوم «GroupBy و Join» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. Deferred Execution

بسیاری از Queryهای LINQ تا زمان Enumeration اجرا نمی‌شوند. ToList و ToArray نتیجه را Materialize می‌کنند.

مثال

var list=new List<int>{1,2}; var q=list.Where(x=>x>1); list.Add(3); Console.WriteLine(string.Join(",",q));

در این مثال، مفهوم «Deferred Execution» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۷. مثال‌های عملی

var expensiveProducts = products
             .Where(p => p.Price > 1_000_000m)
             .OrderByDescending(p => p.Price)
             .Select(p => new { p.Name, p.Price })
             .ToList();

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

var groups = products
             .GroupBy(p => p.Category)
             .Select(g => new { Category = g.Key, Count = g.Count() });

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۸. خطاهای رایج

• استفاده از Single وقتی چند نتیجه مجاز است

• اجرای ToList زودهنگام در چند مرحله

• Queryهای بسیار طولانی و چندمنظوره

۹. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۱۰. تمرین عملی

لیستی از محصولات را بر اساس دسته گروه‌بندی کنید و برای هر دسته تعداد، میانگین قیمت و گران‌ترین محصول را به دست آورید.

۱۱. جمع‌بندی

در این فصل، مبانی «LINQ» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.