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

Basic LINQ Query Operations (عملیات بنیادی LINQ)

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

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

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    این بخش مقدمه ی مختصری به عبارت های LINQ query و برخی انواع عملکردهای متداولی که در یک query اجرا می کنید، ارائه می دهد.

    نکته:
    اگر تقریبا با زبان query مانند SQL یا XQuery آشنایی دارید، میتوانید از قسمت های زیادی از این بخش بگذزید. در مورد "from clause" در بخش بعدی خواهید خواند تا در مورد نرنیب بندها در عبارات LINQ query یاد بگیرید.

    برقراری یک منبع داده:
    در یک LINQ query اولین مرحله تعیین منبع داده می باشد. در C# مانند اکثر زبان های برنامه نویسی، یک متغیر قبل از اینکه بتواند استفاده شود، باید اعلام شود. در یک LINQ query، بند from برای تولید منبع داده (customers) و متغیر محدوده (cust) ابتدا قرار می گیرد.

    کد:
    //queryAllCustomers is an IEnumerable
    var queryAllCustomers = from cust in customers
                            select cust;
     
    BLACK STAR و MajiD.JD از این پست تشکر کرده اند.
  2. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    متغیر محدوده (range variable) مانند تکرار متغیر در یک لوپ foreach می باشد، به جز اینکه هیچ تکرار حقیقی در یک عبارت query اتفاق نمی افتد. وقتی query اجرا می شود، متغیر محدوده ( range variable) به عنوان یک مرجع برای هرکدام از عناصر بعدی در customers به کار گرفته خواهد شد. از آنجایی که کامپایلر می تواند به نوع cust اشاره کند، مجبور نخواهید بود آن را به طور واضح تعیین کنید. متغیرهای محدوده ی بیشتر به وسیله ی عبارت let معرفی می شوند.

    نکته:
    برای منابع داده ی غیرعمومی (non-generic) مانند ArrayList، محدوده ی متغیر باید به طور واضح تایپ شده باشد.
     
    BLACK STAR و MajiD.JD از این پست تشکر کرده اند.
  3. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    Filtering
    احتمالا متداول ترین عملکرد query به کار گرفتن یک فیلتر به شکل یک عبارت Boolean می باشد. فیلتر باعث می شود که query تنها عناصری را بازگرداند که عبارت برای آنها درست است. نتیجه با استفاده از عبارت where تولید می شود. فیلتر تعیین می کند که کدام عناصر از ترتیب منبع خارج شوند. در مثال زیر تنها مشتریانی که دارای آدرس در لندن هستند گزارش داده شده اند:
    کد:
    var queryLondonCustomers = from cust in customers
                               where cust.City == "London"
                               select cust;

    شما می توانید از C# آشنا اپراتورهای AND و OR برای به کار بردن هر تعداد عبارات فیلتر که مورد نیاز است در بند where استفاده کنید. برای مثال برای گزارش دادن مشتریانی که در لندن هستند و نام Devon دارند، کد زیر را خواهید نوشت:

    کد:
    where cust.City=="London" && cust.Name == "Devon"

    برای گزارش دادن مشتریانی از لندن یا پاریس، کد زیر را می نویسید:

    کد:
    where cust.City == "London" || cust.City == "Paris"
     
    BLACK STAR و MajiD.JD از این پست تشکر کرده اند.
  4. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    ترتیب گذاری:
    اغلب اوقات بهتر است که داده ی گزارش شده را تقسیم بندی کرد. عبارت orderby باعث خواهد شد که عناصر در ترتیب گزارش شده طبق مقایسه گر پیش فرض برای نوع تقسیم بندی، مرتب شوند. برای مثال query زیر می تواند برای مرتب کردن نتایج بر اساس پراپرتی Name گسترش یابد. از آنجایی که Name یک رشته می باشد، مقایسه گر پیش فرض یک تقسیم بندی الفبایی از A تا Z اجرا می کند.

    کد:
    var queryLondonCustomers3 =
        from cust in customers
        where cust.City == "London"
        orderby cust.Name ascending
        select cust;
    برای مرتب کردن نتایج به شکل معکوس از Z تا A، از عبارت orderby…descending استفاده کنید.
     
    BLACK STAR و MajiD.JD از این پست تشکر کرده اند.
  5. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    گروه بندی:
    عبارت group شما را قادر می سازد تا نتایج خود را براساس کلیدی که تعیین کرده اید، گروه بندی کنید. برای مثال می توانید مشخص کنید که نتایج براساس شهر گروه بندی شوند، طوریکه همه ی مشتریان از لندن تا پاریس در گروه های مجزا قرار می گیرند. در این مورد کلید عبارت 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);
          }
      }
    وقتی که یک query را با عبارت group به پایان می رسانید، نتایج شما شکل لیستی از لیست ها را به خود می گیرد. هر عنصر در لیست یک آبجکت می باشد که دارای یک عضو کلیدی و یک لیستی از عناصر است که تحت عنوان آن کلید گروه بندی شده اند. وقتی که یک query را تکرار می کنید که ترتیبی از گروه ها را تولید می کند، باید از یک لوپ foreach تودرتو استفاده کنید. لوپ خارجی در هر گروه تکرار می شود و لوپ داخلی روی اعضای هر گروه تکرار می شود.

    اگر که باید به نتایج عملکرد یک گروه اشاره کنید، نی توانید از لغت کلیدی into برای ایجاد یک تشخیص دهنده استفاده کنید که می تواند بیشتر مورد بررسی قرار بگیرد. Query زیر تنها گروه هایی را گزارش می دهد که حاوی بیشتر از دو مشتری هستند:

    کد:
    // 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;
     
    BLACK STAR و MajiD.JD از این پست تشکر کرده اند.
  6. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    اتصال:
    اتصال عملکردها ارتباط هایی بین نتایجی که به طور واضح قالب بندی نشده اند، برقرار می کند. برای مثال می توانید یک اتصال برای یافتن همه ی مشتریان و توزیع کننده هایی که دارای یک موقعیت هستند، برقرار کنید. در LINQ عبارت join به جای ازتباط مستقیم با جدول های دیتابیس، همیشه در مقابل مجموعه های آبجکت عمل می کند.

    کد:
    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 در مدل آبجکت به عنوان پراپرتی هایی نمایش داده می شوند که مجموعه ای از آیتم ها را درخود دارند. برای مثال یک آبجکت Customer حاوی مجموعه ای از آبجکت های Order می باشد. به جای اجرای یک اتصال، با استفاده از نقطه نماد (dot notation) به ترتیب ها دسترسی پیدا می کنید.

    کد:
    from order in Customer.Orders...
     
    BLACK STAR و MajiD.JD از این پست تشکر کرده اند.
  7. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    انتخاب (Projections)
    عبارت select نتایجی از query را تولید می کند و شکل یا نوع هر عنصر گزارش شده را مشخص می کند. برای مثال می توانید مشخص کنید که آیا نتایج شما حاوی آبجکت های کامل Customer ، تنها یک عضو، زیر مجموعه ای از اعضا و یا انواع مختلف نتیجه براساس یک محاسبه یا ایجاد آبجکت جدید، خواهد بود. وقتی عبارت select چیزی به غیر از یک کپی از عنصر منبع تولید می کند، این عملکرد projection نامیده می شود. استفاده از projection ها برای تبدیل داده قابلیت قدرتمند از عبارات LINQ query می باشد.
     
    BLACK STAR و MajiD.JD از این پست تشکر کرده اند.