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

(Language-Integrated Query (LINQ

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

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

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    مجموعه ای از ویژگی هاست که در Visual Studio 2008 مطرح می شود. در طول زمان زبان های متفاوتی برای انواع منابع داده گسترش پیدا کرده اند، به عنوان مثال SQL برای دیتابیس های رابطه ای ( relational database) و XQuery برای XML. بنابراین توسعه دهنده ها باید یک زبان query جدید برای هر نوع منبع داده و یا فرمت داده ای که باید پشتیبانی شود، فرا بگیرند. LINQ با ارائه ی یک مدل منسجم برای کار با داده در مقابل انواع مختلف منابع داده و فرمت ها، این موقعیت را ساده می سازد. در یک LINQ query همیشه با آبجکت ها کار می کنید. شما از الگوهای کد گذاری مشابه برای query استفاده می کنید و در داکیومنت های XML، دیتابیس های SQL، ADO.NET Datasets،مجموعه های .NET، و هر فرمت دیگری که برای آن یک تامین کننده ی LINQ وجود دارد، داده را تبدیل می کنید.
     
    Bahar از این پست تشکر کرده است.
  2. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    سه بخش از یک عملکرد Query:
    همه ی عملکردهای LINQ query حاوی سه فعالیت مجزا هستند:
    1. برقراری منبع داده
    2. ایجاد یک query
    3. اجرای query
    مثال زیر نشان می دهد که چگونه سه بخش از عملکرد یک query در کد گذاری مشخص شده اند. این مثال از یک ردیف میانی به عنوان منبع داده برای راحتی استفاده می کند. به هرحال همان مفاهیم برای دیگر منابع داده نیز به کار می روند. به این مثال در ادامه ی این بخش اشاره خواهد شد.

    کد:
    class IntroToLINQ
    {       
        static void Main()
        {
            // The Three Parts of a LINQ Query:
            //  1. Data source.
            int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
     
            // 2. Query creation.
            // numQuery is an IEnumerable
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;
     
            // 3. Query execution.
            foreach (int num in numQuery)
            {
                Console.Write("{0,1} ", num);
            }
        }
    }
     
  3. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    توضیحات بعدی عملکرد کامل یک query را نشان می دهد. در LINQ اجرای query از خود query مجزا می باشد. به عبارت دیگر شما هیچ داده ی دیگری را با ایجاد یک متغیر query بازیابی نکرده اید.
     
  4. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    منبع داده:
    در مثال قبل از آنجایی که منبع داده یک ردیف می باشد، بنابراین از اینترفیس عمومی IEnumerable پشتیبانی می کند. این واقعیت به این معناست که می تواند با یک LINQ تنظیم شود. یک query در یک وضعیت foreach اجرا می شود و این وضعیت به IEnumerable یا IEnumerable احتیاج دارد. انواعی که IEnumerable یا یک اینترفیس استخراج شده مانند IQueryable عمومی را پشتیبانی می کند، queryable types نامیده می شوند.


    یک queryable types اصلا نیازی به اصلاح رفتار خاص با سرور به عنوان منبع داده ی LINQ ندارد. اگر منبع داده به عنوان یک queryable types در حافظه نیست، یک ارائه کننده ی LINQ باید آن را نمایش دهد. برای مثال LINQ بر روی XML یک داکیومنت XML را بر روی نوع queryable XElement بارگذاری می کند:

    کد:
    // Create a data source from an XML document.
    // using System.Xml.Linq;
    XElement contacts = XElement.Load(@"c:\myContactList.xml");

    با LINQ به SQL شما ابتدا یک طرح بندی object-relational در رمان طراحی یا به طور دستی یا با استفاده از Object Relational Designer (O/R Designer) ایجاد کرده اید. شما query های خود را در مقابل آبجکت ها می نویسید و در زمان اجرا LINQ، SQL ارتباط با دیتابیس را بررسی می کند. در مثال زیر Customers یک جدول خاص در دیتابیس را نشان می دهد، و نوع نتیجه ی query، IQueryable از IEnumerable استخراج می شود.

    کد:
    Northwnd db = new Northwnd(@"c:\northwnd.mdf");
     
    // Query for customers in London.
    IQueryable custQuery =
        from cust in db.Customers
        where cust.City == "London"
        select cust;
    برای اطلاعات بیشتر در مورد چگونگی ایجاد منابع داده ی خاص، مستندات مربوط به ارائه کننده های LINQ مختلف را بررسی کنید. به هرحال قانون اصلی بسیار ساده است: یک منبع داده ی LINQ هر آبجکتی می باشد که اینترفیس عمومی IEnumerable را پشتیبانی می کند، یا یک اینترفیس که از آن استخراج شده است.
     
  5. مدیر بازنشسته☕

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

    انواعی مانند ArrayList که اینترفیس غیرعمومی IEnumerable را پشتیبانی می کنند، می توانند به عنوان منبع داده ی LINQ نیز استفاده شوند. برای اطلاعات بیشتر How to: Query an ArrayList with LINQ را بررسی کنید.
     
  6. مدیر بازنشسته☕

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


    در مثال قبل query تمام تعداد زوج را از ردیف میانی بازمی گرداند. عبارت query حاوی سه بند می شود:


    from, where و select . (اگر شما با SQL آشنا باشید، متوجه خواهید شد که ترتیب عبارت ها معکوس ترتیب آن در SQL می باشد.) بند from منبع داده را تعیین می کند، بند where فیلتر را به کار می گیرد و بند select نوع عناصر بازگردانده شده را تعیین می کند.


    این بندها و همچنین دیگر بندهای query با جزئیات بیشتر در بخش LINQ Query Expressions (C# Programming Guide) بحث خواهند شد. اکنون مسئله ی مهم این است که در LINQ، متغیر query هیچ فعالیتی انجام نمی دهد و داده ای را بازنمی گرداند، بلکه فقط اطلاعاتی را که برای تولید نتایج در هنگام اجرای query لازم است، ذخیره می کند. برای اطلاعات بیشتر در مورد ساختار query ها در پشت صحنه ها Standard Query Operators Overview. را بررسی کنید.
     
  7. مدیر بازنشسته☕

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

    query ها می توانند با استفاده از روش ارائه شده در ترکیب نیز بیان شوند. برای اطلاعات بیشتر Query Syntax and Method Syntax in LINQ (C#) را بررسی کنید.
     
  8. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    اجرای Query
    اجرای به تعویق افتاده ( deferred execution):
    همانطور که قبلا بیان شد، متغیر query فقط فرمان های query را ذخیره می کند. query تا زمانیکه در یک عبارت foreach متغیر query را تکرار می کنید، اجرای حقیقی به تعویق می افتد. به این مفهوم با عنوان deferred execution اشاره می شود و در مثال زیر توضیح داده می شود:

    کد:
    //  Query execution. 
    foreach (int num in numQuery)
    {
        Console.Write("{0,1} ", num);
    }
    عبارت foreach همچنین مکانی است که نتایج بازیابی می شوند. برای مثال در query قبل تکرار متغیر num هر مقدار را در نتیجه ی گزارش شده حفظ می کند.


    از آنجایی که متغیر query هرگز نتایج query را در خود حفظ نمی کند، شما می توانید آن را هر تعداد که می خواهید اجرا کنید. برای مثال ممکن است یک دیتابیس داشته باشید که متداولا توسط یک برنامه ی مجزا آپدیت شده است. در برنامه ی خود می توانید یک query ایجاد کنید که آخرین داده را بازیابی کند و می توانید به طور مکرر آن را با فاصله اجرا کنید تا هر زمان نتایج متفاوتی دریافت کنید.
     
  9. مدیر بازنشسته☕

    تاریخ عضویت:
    ‏15/8/17
    ارسال ها:
    5,336
    تشکر شده:
    42,669
    امتیاز دستاورد:
    113
    اجبار به اجرای فوری (Forcing immediate execution)
    Query ها که توابع تجمع (aggregation functions) در محدوده ای از عناصر منبع اجرا می کنند، ابتدا باید در آن عناصر تکرار شوند. مثال های چنین query هایی Count, Max, Average و First می باشند. اینها بدون یک عبارت واضح foreach اجرا می شوند، زیرا خود query باید برای بازگردانی یک نتیجه از عبارت foreach استفاده کند. همچنین توجه داشته باشید که این نوع query ها یک مقدار مجزا را بازمی گردانند و نه یک مجموعه ی IEnumerable را. مثال زیر گروهی از اعداد زوج در ردیف منبع را بازمی گرداند:

    کد:
    var evenNumQuery =
        from num in numbers
        where (num % 2) == 0
        select num;
     
    int evenNumCount = evenNumQuery.Count();

    برای اجبار در اجرای فوری در هر query و ذخیره کردن نتایج در حافظه ی پنهان، می توانید روش های ToList یا ToArray را فرا بخوانید.

    کد:
    List< int > numQuery2 =
        (from num in numbers
         where (num % 2) == 0
         select num).ToList();
     
    // or like this:
    // numQuery3 is still an int[]
     
    var numQuery3 =
        (from num in numbers
         where (num % 2) == 0
         select num).ToArray();

    همچنین می توانید با قرار دادن لوپ foreach فورا پس از عبارت query، اجرای اجباری force execution را داشته باشید. به هرحال با فراخوانی ToList یا ToArray می توانید همه ی داده ها را در یک مجموعه ی آبجکت مجزا در حافظه ی پنهان ذخیره کنید.