مدتی برایم این پرسش مطرح شده بود که فرق LINQ و Lambda چیست؟
آیا LINQ همان Lambda ست ؟ یا Lambda همان LINQ ؟ یا کلاً متفاوتند ؟
تا قبل از ارائه نسخه visual studio 2008 معمولاً برنامه نویسان برای انجام عملیات CRUD یا همان فرمانهای select، insert،delete،update در دیتابیس از شیوه کوئری نویسی استفاده میکردند (هنوز هم استفاده میشود) که به آنها دستورات SQL (Structured Query Language) گفته میشود.
این دستورات SQL به دو دسته اصلی تقسیم میشوند :
- دستوراتی برای دستکاری و ویرایش داده ها یا DML (Data Manipulation Language):
این دستورات شامل SELECT،UPDATE،DELETE،INSERT می باشد .
- دستوراتی برای تعریف داده ها یا DDL (Data Definition Language)
این دستورات شامل فرمانهایی چون CREATE DATABASE،ALTER DATABASE،CREATE TABLE،ALTER TABLE،DROPTABLE،CREATE INDEX و DROP INDEX می باشد .
در مورد فرمانهای DML و DDL در پستهای بعدی، مفصلتر صحبت می کنیم.
نمونه ای از دستور Select SQL برای استخراج اطلاعات از جدول :
Select * from table1 where id>10
بعدها و به همراه DotNet Framework 3.5 که همزمان با ویژوال استودیو 2008 ارائه شده بود، شیوه جدید کوئری نویسی قدرتمندی معرفی شد که متناسب با Syntax زبانهای C# و VB در محیط کد نویسی از آن استفاده میشود و LINQ (Language-Integrated Query) نامیده شد.
تفاوت عمده LINQ با فرمانهای SQL این می باشد که بوسیله LINQ می توان از هر نوع منبع داده، واکشی اطلاعات را انجام داد.
فرض کنید که لازمست از مجموعه اعداد موجود در یک آرایه ، اعداد زوج را استخراج نمایید .
تا قبل از تولد LINQ ، برنامه نویسان به شیوه ای شبیه کد زیر سعی میکردند که پاسخ را استخراج کنند:
#C
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach(int num in numbers)
{
if (num % 2 == 0)
evenNumbers.Add(num);
}
VB
Dim numbers() As Integer = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
For Each num As Integer In numbers
If num Mod 2 = 0 Then
evenNumbers.Add(num)
End If
Next num
اما بعد از بدنیا آمدن LINQ ، استفاده از آن بجای فرمانهای SQL راحتتر و مناسبتر بود. اگر به syntax فرمانهای LINQ در زبانهای C# , VB در کدهای زیر دقت نمایید، متوجه میشویم که توابعی که درون دستور LINQ استفاده شده، از Syntax زبان برنامهنویسی پیروی کرده است :
یکی دیگر از تفاوتهای LINQ و SQL این است که دستورات LINQ توسط Debuger ویژوال استودیو قابل شناسایی بوده و خطاهای احتمالی را به برنامه نویس گوشزد می نماید.
#C
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = from n in numbers
where n % 2 == 0
select n;
VB
Dim numbers() As Integer = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
Dim evenNumbers = From n In numbers
Where n Mod 2 = 0
Select n
حالا پیاده سازی همان سناریو بالا به روش زیر توجه نمایید:
#C
var evenNumbers = numbers.Where(n => n % 2 == 0);
VB
Dim evenNumbers = numbers.Where(function(n) n Mod 2 = 0);
به روش پیاده سازی کوئری به شکل بالا، اصطلاحاً Lambda گفته میشود. بعبارتی کامپایلر اجازه میدهد که به هرکدام از دو روش فوق کد کوئری نویسی را پیاده سازی نماییم. چنانچه به کد توجه نمایید، عبارت where n % 2 == 0 به شکل Where(n => n % 2 == 0) در زبان C# نوشته شده و در زبان VB عبارت Where n Mod 2 = 0 به صورت Where(function(n) n Mod 2 = 0) نوشته شده است. این شکل عملگر n => n یا function(n) n ، عملگرهای لامبدا هستند.
بنابراین معلوم میشود که lambda مشابه LINQ با Syntax اختصاصی خود می باشد.
در حقیقت کاربرد هر کدام از شکلهای بالا در نحوه کوئری نویسی، کاملاً سلیقه ای و شخصی و بر اساس علاقه برنامه نویس می باشد، و از نظر Performance هیچ تفاوتی در استفاده از LINQ یا Lambda وجود ندارد و نهایتاً کامپایلر هر دوی آنها را به فرمان SQL ترجمه و سپس اجرا می نماید.
0
34101