ASP.NET - LINQ

اکثر برنامه ها داده محور هستند، با این حال بیشتر مخازن داده ها پایگاه داده های رابطه ای هستند. در طول سال ها، طراحان و توسعه دهندگان برنامه هایی را بر اساس مدل های شی طراحی کرده اند.اشیاء مسئول اتصال به اجزای دسترسی به داده - به نام لایه دسترسی به داده (DAL) هستند. در اینجا باید به سه نکته توجه کنیم:تمام داده های مورد نیاز در یک برنامه کاربردی در یک منبع ذخیره نمی شوند. منبع می تواند یک پایگاه داده رابطه، برخی از شی کسب و کار، فایل XML یا یک وب سرویس باشد.دسترسی به شی در حافظه ساده تر و کم هزینه تر از دسترسی به داده ها از یک پایگاه داده یا فایل XML است.داده های دسترسی مستقیم استفاده نمی شوند، اما باید مرتب شوند، مرتب شوند، گروه بندی شوند، تغییر داده شوند و غیره.از این رو، اگر ابزاری وجود داشته باشد که انواع دسترسی به داده‌ها را آسان می‌کند و امکان اتصال داده‌ها از چنین منابع داده متفاوت و انجام عملیات پردازش داده استاندارد را در چند خط کد فراهم می‌کند، کمک بزرگی خواهد بود.LINQ یا زبان یکپارچه Query چنین ابزاری است. LINQ مجموعه ای از برنامه های افزودنی برای .Net Framework 3.5 و زبان های مدیریت شده آن است که پرس و جو را به عنوان یک شی تنظیم می کند. یک نحو مشترک و یک مدل برنامه نویسی را برای پرس و جو انواع مختلف داده ها با استفاده از یک زبان مشترک تعریف می کند.عملگرهای رابطه‌ای مانند Select، Project، Join، Group، Partition، Set عملیات و غیره در LINQ پیاده‌سازی می‌شوند و کامپایلرهای C# و VB در .Net Framework 3.5، که از نحو LINQ پشتیبانی می‌کنند، کار با داده‌های پیکربندی شده را ممکن می‌سازد. بدون توسل به ADO.NET ذخیره کنید.به عنوان مثال، پرس و جو از جدول مشتریان در پایگاه داده Northwind، با استفاده از پرس و جوی LINQ در سی شارپ، کد زیر خواهد بود:var data = from c in dataContext.Customerswhere c.Country == "Spain"select c;جایی که:کلمه کلیدی «از» به طور منطقی در محتویات مجموعه حلقه می زند.عبارت با کلمه کلیدی "where" برای هر شیء در مجموعه ارزیابی می شود.دستور 'select' شی ارزیابی شده را برای افزودن به لیست در حال بازگشت انتخاب می کند.کلمه کلیدی "var" برای اعلان متغیر است. از آنجایی که نوع دقیق شیء برگشتی مشخص نیست، نشان می دهد که اطلاعات به صورت پویا استنتاج خواهند شد.پرس و جوی LINQ را می توان برای هر کلاس حاوی داده ای که از IEnumerable<T> به ارث می برد اعمال کرد، در اینجا T هر نوع داده ای است، برای مثال List<Book>.اجازه دهید برای درک مفهوم به یک مثال نگاه کنیم. مثال از کلاس زیر استفاده می کند: Books.cspublic class Books{ public string ID {get; set;} public string Title { get; set; } public decimal Price { get; set; } public DateTime DateOfRelease { get; set; } public static List<Books> GetBooks() { List<Books> list = new List<Books>(); list.Add(new Books { ID = "001", Title = "Programming in C#", Price = 634.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Title = "Learn Java in 30 days", Price = 250.76m, DateOfRelease = Convert.ToDateTime("2011-08-15") }); list.Add(new Books { ID = "003", Title = "Programming in ASP.Net 4.0", Price = 700.00m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); list.Add(new Books { ID = "004", Title = "VB.Net Made Easy", Price = 500.99m, DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005", Title = "Programming in C", Price = 314.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "006", Title = "Programming in C++", Price = 456.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007", Title = "Datebase Developement", Price = 1000.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); return list; }}صفحه وب با استفاده از این کلاس دارای یک کنترل برچسب ساده است که عنوان کتاب ها را نمایش می دهد. رویداد Page_Load فهرستی از کتاب ها را ایجاد می کند و عناوین را با استفاده از پرس و جوی LINQ برمی گرداند:public partial class simplequery : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { List<Books> books = Books.GetBooks(); var booktitles = from b in books select b.Title; foreach (var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title); }}هنگامی که صفحه اجرا می شود، برچسب نتایج پرس و جو را نمایش می دهد:عبارت LINQ بالا:var booktitles = from b in books select b.Title;معادل پرس و جوی SQL زیر است:SELECT Title from Booksاپراتورهای LINQبه غیر از عملگرهایی که تاکنون استفاده شده اند، چندین عملگر دیگر نیز وجود دارند که تمام بندهای پرس و جو را پیاده سازی می کنند. اجازه دهید به برخی از عملگرها و بندها نگاه کنیم.بند Join"بند join" در SQL برای اتصال دو جدول داده استفاده می شود و یک مجموعه داده حاوی ستون هایی از هر دو جدول را نمایش می دهد. LINQ نیز قادر به این کار است. برای بررسی این موضوع، کلاس دیگری به نام Saledetails.cs را در پروژه قبلی اضافه کنید:public class Salesdetails{ public int sales { get; set; } public int pages { get; set; } public string ID {get; set;} public static IEnumerable<Salesdetails> getsalesdetails() { Salesdetails[] sd = { new Salesdetails { ID = "001", pages=678, sales = 110000}, new Salesdetails { ID = "002", pages=789, sales = 60000}, new Salesdetails { ID = "003", pages=456, sales = 40000}, new Salesdetails { ID = "004", pages=900, sales = 80000}, new Salesdetails { ID = "005", pages=456, sales = 90000}, new Salesdetails { ID = "006", pages=870, sales = 50000}, new Salesdetails { ID = "007", pages=675, sales = 40000}, }; return sd.OfType<Salesdetails>(); }}کدهای موجود در کنترل کننده رویداد Page_Load را برای پرس و جو در هر دو جدول با استفاده از عبارت join اضافه کنید:protected void Page_Load(object sender, EventArgs e){ IEnumerable<Books> books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); var booktitles = from b in books join s in sales on b.ID equals s.ID select new { Name = b.Title, Pages = s.pages }; foreach (var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title);}صفحه به دست آمده مانند تصویر است:بند کجاعبارت «where» امکان افزودن برخی فیلترهای شرطی به پرس و جو را می دهد. برای مثال، اگر می‌خواهید کتاب‌هایی را ببینید که تعداد صفحات آن بیش از 500 است، کنترل‌کننده رویداد Page_Load را به:var booktitles = from b in books join s in sales on b.ID equals s.ID where s.pages > 500 select new { Name = b.Title, Pages = s.pages };موارد Orderby و Orderbydescending Clausesاین بندها اجازه مرتب سازی نتایج پرس و جو را می دهند. برای استعلام عنوان، تعداد صفحات و قیمت کتاب، مرتب‌سازی شده بر اساس قیمت، کد زیر را در مدیریت رویداد Page_Load بنویسید:var booktitles = from b in books join s in sales on b.ID equals s.ID orderby b.Price select new { Name = b.Title, Pages = s.pages, Price = b.Price};تاپل های برگشتی عبارتند از:بند Letبند let اجازه می دهد تا یک متغیر را تعریف کرده و مقداری را که از مقادیر داده محاسبه می شود به آن اختصاص دهیم. به عنوان مثال، برای محاسبه کل فروش از دو فروش فوق، باید محاسبه کنید:TotalSale = Price of the Book * Salesبرای رسیدن به این هدف، کدهای زیر را در کنترل کننده رویداد Page_Load اضافه کنید:بند let اجازه می دهد تا یک متغیر را تعریف کرده و مقداری را که از مقادیر داده محاسبه می شود به آن اختصاص دهیم. به عنوان مثال، برای محاسبه کل فروش از دو فروش فوق، باید محاسبه کنید:var booktitles = from b in book join s in sales on b.ID equals s.ID let totalprofit = (b.Price * s.sales) select new { Name = b.Title, TotalSale = totalprofit};صفحه پرس و جو به دست آمده مانند نشان داده شده است: