1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

ترکیب مربوط به query و روش ترکیب در LINQ

شروع موضوع توسط AftabGardoon ‏19/4/19 در انجمن ASP.NET

Tags:
  1. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    اکثر query ها در داکیومنتیشن مقدماتی Language Integrated Query (LINQ) با استفاده از ترکیب اعلانی LINQ نوشته می شوند. به هرحال وقتی که کد کامپایل می شود، ترکیب query باید به روش فراخوانی ها برای .NET common language runtime (CLR) ترجمه شود. این فراخوانی ها اپراتورهای استاندارد query را تقاضا می کند که دارای نام هایی مانند Where, Select, GroupBy, Join, Max, و Average می باشند. می توانید آنها را به طور مستقیم با استفاده از ترکیب متود به جای ترکیب query فرا بخوانید.


    Query syntax و method syntax از لحاظ معنایی یکسان هستند، اما برای بسیاری از مردم خواندن ترکیب query بسیار ساده تر و آسانتر می باشد. برخی query ها باید با عنوان فراخوانی های متود (method calls) بیان شوند. برای مثال شما باید از یک method call برای بیان یک query استفاده کنید که تعداد عناصری که با شرایط خاص هماهنگ می شوند، بازیابی کند. همچنین باید برای یک query که در یک توالی منبع دارای حداکثر مقدار می باشد، از یک method call استفاده کنید. مستندات مرجع برای اپراتورهای ایتاندارد query در فضانام System.Linq ازmethod syntax استفاده می کند. بنابراین حتی وقتی نوشتن query های LINQ را شروع می کنید، آشنایی با چگونگی استفاده از method syntax در query ها و در عبارات خود query مفید خواهد بود.
     
  2. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    Standard Query Operator Extension Methods
    مثال زیر یک عبارت query (query expression) ساده را نشان می دهد و از لحاظ معنایی query معادل به عنوان یک method-based query ( query متود محور) نوشته شده است.

    کد:
       class QueryVMethodSyntax
    ‎{‎
    ‎    static void Main()‎
    ‎    {‎
    ‎        int[] numbers = { 5, 10, 8, 3, 6, 12};‎
     
    ‎        //Query syntax:‎
    ‎        IEnumerable< int > numQuery1 = ‎
    ‎            from num in numbers
    ‎            where num % 2 == 0‎
    ‎            orderby num
    ‎            select num;‎
     
    ‎        //Method syntax:‎
    ‎        IEnumerable< int > numQuery2 = numbers.Where(num => num % 2 == ‎‎0).OrderBy(n => n);‎
     
    ‎        foreach (int i in numQuery1)‎
    ‎        {‎
    ‎            Console.Write(i + " ");‎
    ‎        }‎
    ‎        Console.WriteLine(System.Environment.NewLine);‎
    ‎        foreach (int i in numQuery2)‎
    ‎        {‎
    ‎            Console.Write(i + " ");‎
    ‎        }‎
     
    ‎        // Keep the console open in debug mode.‎
    ‎        Console.WriteLine(System.Environment.NewLine);‎
    ‎        Console.WriteLine("Press any key to exit");‎
    ‎        Console.ReadKey();‎
    ‎    }‎
    ‎}‎
    ‎/*‎
    ‎    Output:‎
    ‎    6 8 10 12‎
    ‎    6 8 10 12‎
    ‎ */‎
     
  3. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    خروجی دو مثال یکسان می باشد. مشاهده می کنید که نوع متغیر query در هر دو فرم یکی می باشد: IEnumerable


    برای درک query متود محور(method-based) اجازه بدهید آن را دقیق تر بررسی کنیم. در قسمت راست عبارت دقت کنید که عبارت where به عنوان یک نمونه متود روی آبجکت numbers مطرح می شود که همانطور که به خاطر خواهید آورد دارای نوع IEnumerable می باشد. اگر با اینترفیس عمومی IEnumerable آشنا باشید، می دانید که دارای متود Where نمی باشد. به هرحال اگر لیست کامل IntelliSense را در Visual Studio IDE فرا بخوانید، نه تنها متود Where را مشاهده خواهید کرد، بلکه متودهای بسیار دیگری مانند Select,SelectMany, Join و Orderby را نیز مشاهده می کنید. اینها همه اپراتورهای استاندارد query می باشند.


    گرچه به نظر می رسد که انگار IEnumerable دوباره برای وارد کردن این روش های اضافه تعریف شده است، اما در حقیقت اینطور نیست. اپراتورهای استاندارد query به عنوان متود جدیدی به نام extension method اجرا می شود. این روش ها یک نوع جدید را گسترش می دهند؛ آنها می توانند با عنوان روش های نمونه روی نوع فراخوانده شوند. اپراتورهای استاندارد query مورد IEnumerable را گسترش داده و به این خاطر است که شما می توانید numbers.Where(...) را بنویسید.


    برای شروع با استفاده از LINQ تمام چیزی که باید در مورد متودهای extension بدانید چگونگی آوردن آنها به حوزه ی برنامه ی خود با استفاده از دستورات درست using می باشد. این مسئله در How to: Create a LINQ Project نیز توضیح داده شده است. از دیدگاه برنامه ی شما یک متود extension و یک نمونه متود معمولی مشابه می باشند.


    برخی ارائه دهندگان LINQ مانند LINQ به SQL و LINQ به XML، اپراتورهای استاندارد query خود و متودهای extension اضافه را برای انواع دیگری به غیر از IEnumerable اجرا می کنند.
     
  4. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    عبارات Lambda:x
    در مثال قبل دقت کنید که عبارت شرطی (num % 2 == 0) به عنوان یک استدلال درون خط (in-line) به متود Where منتقل می شود: Where(num => num % 2 == 0) این عبارت درون خطی یک عبارت lambda نامید می شود. این یک روش مناسب برای نوشتن کد است که در غیر این صورت باید به یک فرم سنگین تر به عنوان یک متود بدون نام یا یک نماینده ی عمومی (generic delegate) یا یک درخت بیان (expression tree) نوشته شود. در C# => اپراتور lambda می باشد که با عنوان برو به ("goes to") خوانده می شود. num در سمت چپ اپراتور متغیر ورودی می باشد که با num در عبارت query هماهنگی دارد. کامپایلر می تواند به نوع num اشاره کند، زیرا می داند که numbers یک نوع عمومی IEnumerable می باشد. بدنه ی lambda مشابه عبارت در ترکیب query یا هر عبارت یا وضعیت C# دیگری می باشد، که می تواند حاوی فراخوانی های متود و دیگر منطق های پیچیده باشد. مقدار گزارش شده فقط یک عبارت نتیجه می باشد.


    برای شروع با استفاده از LINQ، لازم نیست منحصرا از lambdas استفاده کنید. به هرحال query های خاصی درmethod syntax و برخی از عبارات لازم lambda بیان می شوند. پس از اینکه با lambdas بیشتر آشنا شدید، متوجه خواهید شد که یک ابزار قدرتمند و انعطاف پذیر در تولباکس LINQ می باشد.
     
  5. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    Composability of Queries
    در مثال قبل دقت داشتید که روش OrderBy با استفاده از اپراتور نقطه (dot) روی فراخوانی به Where تحریک می شود. Where یک توالی فیلتر شده تولید می کند و سپس Orderby روی توالی با مرتب کردن آن عمل می کند. از آنجایی که query ها یک IEnumerable گزارش می دهند، شما با تغییر فراخوانی های متود با هم، آنها را در method syntax می نویسید. این کاری است که کامپایلر در هنگام نوشتن query با استفاده از ترکیب query، در پشت صحنه انجام می دهد. از آنجایی که متغیر query نتایج query را ذخیره نمی کند، می توانید آن را تغییر دهید یا از آن به عنوان پایه برای یک query جدید در هر زمان استفاده کنید، حتی پس از اینکه اجرا شده است.
     
  6. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    منبع: تحلیل داده!
     
  7. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    منبع: تحلیل داده!
     
    Anoosh از این پست تشکر کرده است.