مقاله بررسی و آموزش دستورات LINQ

دستورات LINQ

در این مقاله ما عملیات های Linq  و دستورات LINQ ساده را با استفاده از LINQ به اشیا و LINQ به نهاد (Entity) را توضیح میدهیم.در این بخش من چگونه نوشتن پرسش LINQ را توضیح میدهم. ما میتوانیم پرسش های LINQ را با پلتفرم .Net هر برنامه ی کاربردی استفاده کنیم اما در این مقاله ما عملیات های ساده ی LINQ را با استفاده از LINQ به اشیا و LINQ به Entity در برنامه های ASP.NET اجرا میکنیم.میتوانید از آموزش تصویری LINQ در سی شارپ نیز استفاده کنید.

LINQ (زبان یکپارچه ی پرسشی)

زبان یکپارچه ی پرسشی (LINQ) شامل یک سری از ویژگی ها میباشد که قابلیت ارائه ی پرسش های قدرتمندی به زبان سینتکس C# و ویژوال بیسیک میدهد. LINQ یک تعریف استاندارد با الگوی یادگیری آسان برای پرسش و به روزرسانی داده ها ارائه میدهد و تکنولوژی میتواند گسترش یابد تا به طور بالقوه از هر نوع داده ی ذخیره شده ای حمایت کند.

اجرای LINQ

LINQ تکنولوژی ای است که از منابع داده ای فراوانی پشتیبانی میکند. ما از نوع LINQ زیر که مایکروسافت ارائه داده است برای اجرا استفاده میکنیم.

LINQ به اشیا

LINQ به ADO.NET

  • LINQ به SQL
  • LINQ به Entity
  • LINQ به DataSet

LINQ به XML

PLINQ (LINQ موازی)

LINQ به اشیا

LINQ به اشیا یک روش جدید برای کاکشن ها ارائه میدهد. سهولت برای پرسش با هر کالکشن IE محدود و نامحدود را افزایش میدهد بدون استفاده از ارائه دهنده های LINQ های متوسط . میتوانیم از LINQ برای پرسش های هر کالکشن محدودی نظیر لیست , آرایه یا دیکشنری استفاده کنیم. کالکشن ها میتوانند توسط کاربر تعریف شده باشند و یا توسط یک .NET Framework API بازگردانده شوند.

LINQ به ADO.NET

LINQ به ADO.NET شامل اجرای LINQ های متفاوتی است که نیاز به دستکاری داده های مرتبط مشترک هستند. همچنین شامل تکنولوژی های دیگری که برای هر لایه ی تداوم خاص منحصر به فرد میباشد .

LINQ به SQL

کنترل نقشه برداری بین انواع مخصوص در .NET Framework و طرح جدول فیزیکی در سرور های SQL بر عهده دارد.

LINQ به Entity

LINQ به Entity پشتیبانی از زبان یکپارچه ی پرسشی (LINQ) را ارائه میکند که به توسعه دهندگان امکان نوشتن پرسش هایی درمقابل مدل مفهومی چارچوب Entity را میدهد. LINQ به نهاد زبان یکپارچه ی پرسشی (LINQ) را به پرسش های درخت فرمان تبدیل میکند , پرسش ها را در برابر چارچوب Entity اجرا میکند و اشیایی که میتواند توسط هر دو LINQ و چارچوب Entity مورد استفاده قرار بگیرد را بازمیگرداند.

LINQ به DataSet

این راه آسان و سریعتر برای ذخیره سازی داده های پرسشی در یک شی سری داده ای میباشد. همچنین به LINQ اجازه میدهد که از هر پایگاه داده ای که میتواند توسط ADO.NET پرسش شود , پرسش طرح کند.

LINQ به SQL و LINQ به Entity شباهت هایی دارند زیرا هردوی آنها به اطلاعات ذخیره شده ی مرتبط با پایگاه داده دسترسی دارند و بر اشیای Entity ای که ارائه دهنده ی داده ی خارجی در حافظه است عملیات انجام میدهند. تفاوت عمده ی آنها در این است که هرکدام در سطح انتزاعی متفاوتی عملیات انجام میدهند. در حالیکه LINQ به SQL محدود به ساختار پایگاه داده ای فیزیکی میباشد , LINQ به Entity در مدل مفهومی (Entity کاری) عملیات انجام میدهد که ممکن است بسیار دور از ساختار فیزیکی باشد (جدول های پایگاه داده ای).

LINQ به XML

این یک رابط برنامه نویسی XML بهبود یافته ارائه میدهد. با استفاده از این میتوانیم پرسش در تغییرات اسناد XML ایجاد کنیم و همچنین اسناد را پس از تغییرات ذخیره کنیم.فضای نام System.Xml.Linq شامل کلاس هایی برای LINQ به XML میباشد.

PLINQ (LINQ موازی)

PLINQ در .NET Framework 4.0معرفی شد. این LINQ به اشیا را طی یک کتابخانه ی برنامه نویسی موازی جدید گسترش داد. با استفاده از این ما میتوانیم شکستن/تقسیم کردن یک پرس وجو به طور همزمان/موازی در پردازنده های متفاوت را اجرا کنیم.

پرسش های LINQ

یک پرسش یک اصطلاح است که داده ها را از منبع داده دریافت میکند. پرسش ها معمولا به زبان پرسش مخصوصی بیان میشوند. LINQ این وضعیت را با پیشنهاد یک مدل استوار برای کار با داده درمیان انواع فراوان منابع داده و فرمت ها ساده سازی میکند. در یک پرسش LINQ ما همیشه با اشیا کار میکنیم .

عملیات های پرسش تاکید بر ۳ کار متمایز دارند :

  • دریافت منبع داده
  • ساخت پرسش
  • اجرای پرسش

مثال زیر نشان میدهد که سه بخش یک عملیات پرسش چگونه در یک منبع کد بیان میشوند :

// The Three Parts of a LINQ Query: 
        //  ۱. Data source. 
        int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

        // ۲. Query creation. 
        // numQuery is an IEnumerable<int> 
        var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;

        // ۳. Query execution. 
        foreach (int num in numQuery)
        {
            Console.Write("{0,1} ", num);
        }

دستورات LINQ

منبع داده
در کد بالا منبع داده یک آرایه است ; این به طور ضمنی از رابط IE قابل شمارش عمومی پشتیبانی میکند. پرسش بالا با بیان foreach اجرا میشود و foreach به IE های قابل شمارش یا غیرقابل شمارش احتیاج دارد.
در LINQ به SQL ما ابتدا یک شئ میسازیم – مرتبط با نقشه برداری در زمان طراحی چه به صورت دستی یا با استفاده از طراحی کننده ی مربوطه (O/R Designer ).
در مثال , tt_WCF_Lab1_Products یک جدول به خصوص در پایگاه داده و نوع نتیجه ی پرسش , IQeryable , مشتقات قابل شمارش را ارائه میدهد.

LabDbEntities sqlObj = new LabDbEntities();

IQueryable<tt_wcf_lab1_products> productQuery = from prds in   sqlObj.tt_WCF_Lab1_Products
                            select new
                            {
                                prds.ProdSysId,
                                prds.Name,
                                prds.Price

                            };



</tt_wcf_lab1_products>

پرسش
پرسش مشخص میکند که چه اطلاعاتی باید از منبع یا منابع داده  دریافت شود. به صورت اختیاری یک پرسش همچنین مشخص میکند که اطلاعات چگونه باید ذخیره , دسته بندی و تشکیل شوند قبل از آنکه بازگردند. یک پرسش در در یک متغیر پرسش ذخیره شده و مقداردهی اولیه ی آن با بیان پرسش انجام میشود . بیانات پرسش شامل سه شاخه است : از , کجا و انتخاب. شاخه از منبع داده را مشخص میکند , شاخه ی کجا فیلتر را اعمال میکند و شاخه انتخاب نوع المان بازگشتی را مشخص میکند.
اجرای پرسش
اجرای به تعویق افتاده
متغیر پرسش تنها دستورات پرسش را در خود ذخیره میکند. اجرای واقعی یک پرسش تا زمانی که شما متغیر پرسش را بیش از حد در یک بیان foreach تکرار نکرده اید به تعویق می افتد. مثال زیر را ببینید :

//  Query execution.  
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

بیان foreach همچنین نشان میدهد که نتایج پرسش در کجا دریافت شوند.
اجبار به اجرای فوری
پرسش هایی که تجمعی از تابع ها را در طول المان های منبع اجرا میکنند باید ابتدا باید بیش از المان ها تکرار شوند. مثال هایی از این پرسش ها : شمارش , ماکسیمم , میانگین و اولین را میتوان نام برد. این ها بدون یک بیان foreach  صریح اجرا میشوند زیرا خود پرسش باید از foreach برای بازگرداندن نتایج اسفاده کند.

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

برای اجبار به اجرای فوری هر پرسشی و کش نتایج آن , میتوانید متد های 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();

</int>

عملیات های ساده ی پرسش LINQ با استفاده از LINQ به اشیا

LINQ به رشته ها

از LINQ میتوان برای پرسش و تبدیل رشته ها و کالکشنی از رشته ها استفاده کرد. ما پرسش LINQ را بر روی یک رشته مینویسیم تا کلمات متمایز درون رشته را پیدا کند و کلمات درون رشته را تکرار کند.

string input = "this is linq query"; 
var wordsorderbylength = from str in input.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) 
                            orderby str.Length 
                            select new { WordsOrderByLength = str };

LINQ به آرایه ی رشته ای

ما پرسش LINQ را مینویسیم و ماه هایی که با حرف ” ژ ”  آغاز میشوند را در آرایه ی رشته ای میابیم.

string[] ary = new string[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
var res = from months in ary
            where months.StartsWith("J")
            select new { MonthStartWith_J = months };

LINQ به آرایه ی عدد صحیح

ما پرسش LINQ را مینویسیم و ۳ کوچکترین عدد در آرایه ای از اعداد را میابیم.

int[] ary5 = new int[] { 10, 27, 35, 40, 50, 11, 23, 25, 39, 22, 36 };
var minvalues = (from values in ary5
                    orderby (int)values ascending
                    select new { Min3Values = values }).Take(3);

 

LINQ به فایل ها و راهنماها

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"E:\images");
var giffiles = from file in dir.GetFiles()
                where file.Extension == ".gif"
                orderby file.Length
                select new { FileName = file.Name, FileSize = (file.Length / 1024)

 

عملیات های ساده ی پرسش LINQ با استفاده از LINQ به Entites

LINQ به Entities بر روی چارچوب های Entities و برای دسترسی به داده های اساسی پایگاه داده عملیات انجام میدهد .

دریافت یک منبع داده

در یک پرسش LINQ گام اول مشخص کردن منبع داده است. در یک پرسش LINQ شاخه ی “از” در ابتدا برای معرفی منبع داده (Lab1_Products)  و محدوده ی متغیر ها (prod) می آید.

//queryAllCustomers is an IEnumerable< Lab1_Products >
LabDbEntities sqlObj = new LabDbEntities();
var queryAllProducts = from prod  in sqlObj.Lab1_Products select prod;

 

فیلتر کردن

احتمالا رایج ترین عملیات پرسش درخواست یک فیلتر به صورت فرم یک بیان بولین است. فیلتر باعث میشود که پرسش فقط المان هایی که بیان صحیح (True) دارند را بازگرداند. نتیجه با استفاده از شاخه ی “کجا” تهیه میشود. فیلتر در اثر مشخص میکند که کدام المان ها از دنباله ی منبع محروم باشند.

LabDbEntities sqlObj = new LabDbEntities();

            var queryAllProducts = from prod in sqlObj.Lab1_Products
                           where prod.Price > 2000
                           select prod

 

دستور دادن

شاخه ی “مرتب سازی بر اساس” باعث میشود که المان ها در دنباله ی بازگشتی با توجه به مقایسه کننده ی پیش فرض برای مرتب سازی , مرتب شوند.

LabDbEntities sqlObj = new LabDbEntities();

            var queryAllProducts = from prod in sqlObj.Lab1_Products
                           where prod.Price > 2000
                           orderby prod.Name
                           select prod

 

ملحق شدن

ملحق شدن به  عملیات ارتباطی میسازد بین دنباله ای که  به طور صریح در منابع داده مدل بندی نشده اند.
سه روش زیر رایج ترین راه ها برای ملحق شدن هستند :

•    ملحق شدن داخلی
•    ملحق شدن گروهی
•    ملحق شدن چپ بیرونی

ملحق شدن داخلی

ملحق شدن داخلی فقط سوابق و ردیف هایی که مشابه همند و یا در هردو جدول وجود دارند را بازمیگرداند.

LabDbEntities sqlObj = new LabDbEntities();

            var products = from prds in sqlObj.Lab1_Products
                           join inv in sqlObj.Lab1_Inventory on prds.ProdSysId equals inv.ProdSysId
                           select new
                           {
                               prds.ProdSysId,
                               prds.Name,
                               prds.Price,
                               inv.Inven

                           };

 

ملحق شدن گروهی

وقتی که یک شاخه ی ملحق شدن از اصطلاح INTO استفاده میکند , بنام ملحق شدن گروهی شناخته میشود. ملحق شدن گروهی یک دنباله از اشیای آرایه ای بر مبنای خصوصیات هم ارزی از کالکشن چپ و کالکشن راست تهیه میکند . اگر کالکشن راست هیچ المان مشابهی با کالکشن چپ نداشته باشد آنگاه یک آرایه ی خالی تولید مبشود.

LabDbEntities sqlObj = new LabDbEntities();

            var products = from prds in sqlObj.Lab1_Products
                           join sls in sqlObj.Lab1_SalesTrx on prds.ProdSysId equals sls.ProdSysId into g
                           select new
                           {
                               prds.ProdSysId,
                               prds.Name,
                               prds.Price,
                               TotalSales = g.Sum(x => (decimal?)x.Qnt)

                           };

 

ملحق شدن چپ یا ملحق شدن چپ بیرونی

ملحق شدن چپ همه ی سوابق و ردیف های جدول چپ را به همراه فقط سوابق مشابه از جدول راست را بازمیگرداند. اگر هیچ ستون مشابهی در جدول راست وجود نداشت , مقدار Null را بازمیگرداند.

در LINQ برای رسیدن به رفتار ملحق شدن چپ , به صورت اجباری باید از کلمه ی کلیدی “INTO” و متد “DefaultIfEmpty()” استفاده کرد. میتوانیم از ملحق شدن چپ در LINQ استفاده کنیم.

LabDbEntities sqlObj = new LabDbEntities();

            var products = from prds in sqlObj.Lab1_Products
                           join cur in sqlObj.Lab1_Currency on prds.CurrencyId equals cur.CurrencyId
                           into prd
                           from prdts in prd.DefaultIfEmpty()
                           select new
                           {
                               prds.ProdSysId,
                               prds.Name,
                               prds.Price,
                               prdts.CurrencyName

                           };

ملحق شدن صلیبی

ملحق شدن صلیبی یک ملحق شدن دکارتی به معنای محصولات دکارتی از هردو جدول ها است. این ملحق شدن به  شرایط خاصی برای ملحق شدن به دو جدول نیاز ندارد. این ملحق شدن سوابق و ردیف هایی که ضرایب شماره ی سوابق از هردو جدول ( به معنای هر ردیف در جدول چپ متناظر با هر ردیف در جدول راست است.) را بازمیگرداند.

در LINQ برای رسیدن به رفتار ملحق شدن صلیبی , نیازی به استفاده از شاخه های “ملحق شدن” و “کجا” نیست .

LabDbEntities sqlObj = new LabDbEntities();

            var products = from prds in sqlObj.Lab1_Products
                           from cur in sqlObj.Lab1_Currency
                           select new
                           {
                               prds.ProdSysId,
                               prds.Name,
                               prds.Price,
                               cur.CurrencyName

                           };

جمع بندی

در این آموزش یاد گرفتیم که چگونه عملیاتهای LINQ ساده را با استفاده از LINQ به اشیا و LINQ به Entity در برنامه های کاربردی ASP.NET اجرا کنیم..

  • پسورد: www.mspsoft.com
پویا قربانی

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.