LINQ
LINQ(ראשי תיבותשל:LanguageIntegratedQuery) היא שפה הצהרתית דמויתSQLלביצוע שאילתות, שמיקרוסופטשילבה והיבנתה בשפות האימפרטיביות של הדוט נטכ-#Cו-VB.NET.שפה זו מיועדת לעשות הפשטה על פעולות שגרתיות ופעולות על מקור נתונים, ולתווך בין המשתמש בה לבין ביצוע הפעולה הנדרשת. לשפה יש גם מימוש פונקציונלי, ניתן להשתמש בה גם באופן הצהרתי וגם באופן פונקציונלי ואף לערבב בין שתי הדרכים.
מהות השפה
[עריכת קוד מקור|עריכה]שפה זו, מוטמעת בשורות הקוד עצמו, לביצוע שאילתות עלמבני נתוניםכמערך(array), אוסף (collection),רשימה(list), וכל המשתנים המוגדרים בדוט נט כטיפוסי IEnumerable. יעודה של השפה לאפשר למתכנת להתמקד במהות הפעולה המבוקשת ולא בטכניקה התכנותית ליצירת הפעולה. יתרונה בדומה לשפת SQL שהיא מאפשרת לתמצת קוד לשורות בודדות, לזרז את מהירות הפיתוח, להביא את הקוד לקריאות גבוהה, ולהפחית את רמת השגיאות בו.
לפני ההטמעה של שפה זו בדוט נט, אמנם התאפשרה כתיבת שאילתת SQL בדוט נט, אבל לא כחלק מובנה מהשפה, אלא כפקודה שנשלחה אל בסיסי נתונים, ופוענחה על ידיהם, והתייחסה אך ורק לטבלאות בבסיסי הנתונים גופם, ולא אל נתונים בזיכרון כמו מערכים או DataSet.
שפה זו בנוסף מאפשרת לעבוד גם עםבסיסי נתוניםוקובציXML.
הרחבה זו קיימת בדוט נט החל מגרסת 3.5. בגרסה 4 של הדוט נט שפה זו שודרגה והוספה בה אפשרות לבצע שאילתות מקביליות בריבוי תהליכונים(PLINQ).
ארכיטקטורת LINQ במסגרת NET.
[עריכת קוד מקור|עריכה]אופרטורי שאילתה סטנדרטיים
[עריכת קוד מקור|עריכה]תיאורי האופרטורים מבוססים על היישום של עבודה עם אוספים. רבים מהאופרטורים לוקחים פונקציות אחרות כארגומנטים. פונקציות אלה עשויות להיות מסופקות בצורה של שיטה בעלת שם או פונקציה אנונימית.
קבוצת אופרטורי השאילתה שהוגדרה על ידי LINQ חשופה למשתמש כממשק תכנות היישומים של אופרטורי השאילתה הסטנדרטיים (אנ' Standard Query Operator API). אופרטורי השאילתה הנתמכים על ידי ה-API הם:[1]
Select
האופרטור Select מבצעהטלהעל האוסף כדי לבחור היבטים מעניינים של האלמנטים. המשתמש מספק פונקציה שרירותית, בצורה של ביטוי פונקציונלי או ביטוי למדא, המקרינה את קבוצת המידע הרצויה. הפונקציה מועברת לאופרטור כנציג (טיפוס המצביע על פונקציה).
Where
האופרטור Where מאפשר הגדרה של קבוצה של כללי מיפוי המוערכים עבור כל אובייקט באוסף, בעוד שאובייקטים שאינם תואמים לכלל מסוננים החוצה. במילים אחרות, where יציין קריטריוני שדה שכל רשומה שעומדת בהם תוצג בתוצאות. המיפוי מסופק לאופרטור כנציג.
דוגמאות
[עריכת קוד מקור|עריכה]הסרת ערכים כפולים ומיון ברשימה
[עריכת קוד מקור|עריכה]בדוגמה הבאה בשפת#Cמתבצעת פעולה של הסרת ערכים כפולים מתוך משתנה רשימה המכיל מחרוזות ומיונם לאחר הסרת תווי רווח מקדימים. לתוך משתנה t (שהוא במקרה הזה System.Linq.Enumerable.WhereSelectEnumerableIterator) מוכנסים הערכים המחרוזתיים לאחר שבוצע בהם קיבוץ לפי תוכן. לאחר מכן לולאה עוברת על האיברים ומכניסה אותם למשתנה list2.
privateList<string>DistinctAndOrderBy()
{
List<string>list=newList<string>{"BBB","aaa","hhh","BBB","aaa","ZZZ","hhh","ZZZ"};
vart=fromninlist
orderbyn.TrimStart()
groupnbynintodistinctStr
selectdistinctStr;
List<string>list2=newList<string>();
foreach(vardistinctStrint)
list2.Add(distinctStr.Key);
returnlist2;
}
// התוצאה שתתקבל היא:
// list2 = aaa, BBB,hhh, ZZZ,
סכימת ערכי מערך
[עריכת קוד מקור|עריכה]באמצעות שפה זו ניתן לסכום ערכי מערך בפקודה אחת. באמצעות הפעלת פונקציית Sum על מערך מתבצע סיכום של כל איברי המערך. פונקציה זו חוסכת את יצירת הלולאה שצריך ליצור בתכנות מסורתי.
int[]nums=newint[]{1,4,2,6,3,8,3,1,2,5};
intresult=nums.Sum();
Console.WriteLine(result);
תוצאהשתתקבל:
35
שליפת ערכים העונים לתנאי מסוים
[עריכת קוד מקור|עריכה]דוגמה נוספת היא שליפת איברים הגדולים מהערך 5, ומיונם על פי גודלם. פעולה זו חוסכת לולאה וכן פעולת מיון של איברים בתוך המערך החדש. הדוגמה ממומשת באמצעות הדרך הפונקציונלית ותחשיב למדא.
int[]nums=newint[]{1,4,2,6,3,8,3,1,2,5,9};
varresult=nums.Where(n=>n>5).OrderBy(n=>n);
תוצאהשתתקבל:
6
8
9
ראו גם
[עריכת קוד מקור|עריכה]קישורים חיצוניים
[עריכת קוד מקור|עריכה]- אתר האינטרנט הרשמישל LINQ
- LINQ,אתר MSDN
- מדריך לינק,אתר וובמסטר
- תוכנת עזר לשפה,אתר linqpad
- 059 שפת שאילתות אינטגרטיבית LINQ,הפודקסט של רון ורן
הערות שוליים
[עריכת קוד מקור|עריכה]- ^Microsoft,Standard Query Operators