LINQ המילה LINQ מייצגת ראשי תיבות של Language-Integrated Query, ומאפשרת לתשאל נתונים מתוך שפות התכנות של .net באופן דומה לזה שבו מאפשרת SQL לתשאל נתונים מבסיס הנתונים. שפת השאילתות LINQ מאפשרת לגשת ולתשאל מגוון רחב של מקורות הבנויים על בסיס VB.NET או C#. המקורות כוללים אוספים בקוד שלך, קבצי XML, .NET DataSets ובסיסי נתונים. במאמר זה נעסוק ב- LINQ to SQL, אותו רכיב של LINQ שמאפשר לתשאל בסיסי נתונים מסוג SQL SERVER של מיקרוסופט. LINQ אינה רק תוספת שמהווה חלק מסביבת העבודה .NET השפה LINQ תוכננה ויושמה כחלק ממשי של שפות התכנות ב-.NET פירוש הדבר ש-LINQ משולבת באמת לתוך .NET ונותנת דרך מאוחדת לתשאל נתונים מבלי להתחשב במקור הנתונים. בנוסף, מכיוון שהיא משולבת לתוך השפה ולא בסוג פרויקט מסוים, LINQ זמינה לכל סוגי הפרוייקטים כולל יישומי אינטרנט, יישומי טפסי Windows, יישומי Console, ועוד. התחביר של LINQ דומה לזה של SQL, שפת השאילתות הפופולרית ביותר עבור בסיסי נתונים טבלאיים. פירוש הדבר, שכדי לקבל נתונים ממקור נתונים, משתמשת LINQ במילות מפתח כמו Select, From ו-Where.
כדי לקבל מושג כיצד נראית שאילתת LINQ, לפניך דוגמה שמציגה רשימה של אנשים ששמם מתחיל באות א': Using System.Linq; … String[] authors = new string[]{"אבי","רועי","אהרון","נדב","גיא"}; var result = from author in authors
where author.StartsWith("א")
select author; foreach (var author in result)
{
Label1.Text += author + "
";
}
LINQ to SQL עם LINQ to SQL אפשר לקחת קבוצת אובייקטים של בסיס נתונים, טבלאות למשל, ולהפוך אותם לאובייקטים של .NET שאליהם אפשר לגשת מתוך הקוד. ביכולתך להשתמש אז באובייקטים אלה בשאילתות או להשתמש בהם ישירות בתרחישי קשירת נתונים – data binding. התוכנה VWD כוללת את המעצב object-relational שמאפשר ליצור מודל אובייקטים שנגיש דרך קוד שמבוסס על טבלאות בסיס הנתונים. ע"י גרירת טבלאות אל מעצב זה, VWD יוצרת קוד שמאפשר לגשת לנתוני היסוד בבסיס הנתונים מבלי שתצטרך לכתוב קוד רב.
הטבלאות שאתה גורר אל המעצב מאוחסנות בקובץ dbml ובקבצי הקוד ברקע שלו. קבצים אלה מכילים מחלקה שיורשת מ-DataContext, הישות העיקרית ב- LINQ to SQL שמספקת גישה לבסיס הנתונים. המעצב חכם דיו כדי לגלות את הקשרים בבסיס הנתונים, ולכן הוא מסוגל ליצור את הקשרים הנחוצים גם בקוד.
הצגת תחביר השאילתה אופרטורי שאילתה תקניים
LINQ תומכת במספר גדול של אופרטורים של שאילתה – מילות מפתח שמאפשרות לבחור, לסדר או לסנן את הנתונים שיוחזרו מהשאילתה. Select
מילת המפתח Select משמשת לאחזור אובייקטים מהמקור שאותו מתשאלים.
בדוגמה הבאה תראה כיצד לבחור אובייקט מסוג קיים. מאוחר יותר נלמד כיצד להגדיר צורות אובייקטים חדשות תוך כדי ביצוע. var allReviews = from r in myDataContext.Reviews
select r; המשתנה 'r' בדוגמה זו הוא משתנה שזמין רק בתוך השאילתה הנוכחית. משתנה זה מוצג בדרך כלל בפסקת Form, ומשתמשים בו שוב בפסקת Where ו-Select כדי לסנן נתונים וכדי לציין את הנתונים שברצונך לבחור. למרות שבאפשרותך לבחור למשתנה כל שם שתרצה, הרי שלעתים קרובות תראה משתנים בעלי שם של אות אחת כמו 'r' או שהשם הוא צורת היחיד של האוסף שאותו מתשאלים (כמו בדוגמא, r במקום review). From
From אינו נחשב לאופרטור שאילתה תקני מכיוון שאינו פעיל על הנתונים אלא מצביע עליהם. למרות זאת, הפסקה From היא גורם חשוב בשאילתת LINQ מכיוון שהיא קובעת את שם האוסף או שם מקור הנתונים שהשאילתה חייבת לפעול עליו. Order By
הפסקה Order By מאפשרת למיין את הפריטים באוסף התוצאה. לאחר Order By יכולות לבוא מילות המפתח Ascending או Descending שמציינות את סדר המיון.
אפשר לציין קריטריונים רבים על ידי הפרדתם בפסיק זה מזה. השאילתה הבאה מחזירה רשימה של סגנונות שממוינים תחילה לפי SortOrder בסדר יורד, ואז ממוינים לפי Name בסדר עולה. var allGenres = from g in myDataContext.Geners
orderby g.SortOrder descending, g.Name
select g; Where
הפסקה Where ב-LINQ בדיוק כמו הפסקהWHERE ב- SQL, מאפשרת לסנן את האובייקטים שמוחזרים על ידי השאילתה. השאילתה הבאה מחזירה את כל הסקירות המורשות: var allReviews = form r in myDataContext.Revies
where r.Authorized == true
select r;
Sum, Min, Average ו- Count
אופרטורי צבירה אלה מאפשרים לבצע חישובים מתמטיים על האובייקטים שבקבוצת התוצאה. לדוגמה, כדי לאחזר את SortOrder הממוצע עבור כל הסגנונות, תוכל לבצע את השאילתה הבאה: var average = (from g in myDataContext.Geners select g.SortOrder).Average(); שים לב שהשיטה Average חלה על קבוצת התוצאה כולה. לכן, יש לעטוף את המשפט כולו בסוגריים ובעקבותיהם תבוא קריאה לשיטה Average. ללא הסוגריים תקבל שגיאה.
באופן דומה תוכל לאחזר בדרך זו את מספר הסקירות: var numberOfReviews = (from r in myDataContext.Reviews select r).Count();
Take, Skip, TakeWhile ו- SkipWhile
Take ו- Skip מאפשרות לבצע בחירות-משנה בתוך קבוצת התוצאה. הדבר מתאים ביותר לתרחישי דפדןף שבהם הרשומות מאוחזרות עבור הדף הנוכחי בלבד. Take אוספת כמות של אלמנטים מקבוצת התוצאה ומתעלמת מהשאר, בעוד Skip מדלגת על מספר אלמנטים המבוקשים ומחזירה את הבאים.
הדוגמא הבאה מראה כיצד לאחזר את דף הרשומות השני, כאשר מוגדר שגודל דף הוא 10: var allRevies = (from r in myDataContext.Reviews
select r).Skip(10).Take(10); בדיוק כמו במקרה של Average, השאילתה עטופה בזוג סוגריים ובעקבותיהם באה הקריאה ל-Skip ו- Take להשיג את הרשומות המבוקשות. Single ו- SingleOrDefault
האופרטורים Single ו- SingleOrDefault מאפשרים להחזיר אובייקט יחיד כמופע בעל סוג מובהק. הדבר שימושי כשידוע שהשאילתה מחזירה רשומה אחת בדיוק. לדוגמה, כשמאוחזרת רשומה לפי ID הייחודי שלה. הדוגמה הבאה מאחזרת מבסיס הנתונים את הסקירה בעלת ID שערכו 22: var review22 = (from r in myDataContext.Reviews
where r.Id == 22
select r).Single(); אם הפריט המבוקש לא נמצא, או כאשר השאילתה מחזירה יותר ממופע אחד, יעורר האופרטור Single שגיאה. אם רצונך שהשיטה תחזיר ריק(null) או את ערך ברירת המחדל עבור סוג הנתונים הרלוונטי (כמו 0 עבור Integer, False עבור בוליאני וכו'), השתמש ב-SingleOrDefault. למרות שבבסיס הנתונים קיימת רק סקירה אחת בעלת Id שערכו 22, הרי שאם תשמיט את הקריאה ל-Single, עדיין תקבל רשימת סקירות (שמחזיקה אלמנט אחת בלבד). השימוש ב-Single כופה החזר של מופע יחיד מהסוג שאתה מתשאל לגביו. First, FirstOrDefault, Last ו- LastOrDefault
אופרטורים אלה מאפשרים להחזיר את האיבר הראשון או האחרון בסדרה נתונה של אובייקטים. בדיוק כמו עם האופרטור Single, גם First ו- Last מעוררים שגיאה כשהאוסף ריק, בעוד שני האופרטורים האחרים מחזירים את ערך ברירת המחדל עבור סוגי הנתונים הרלוונטיים. בניגוד ל-Single, האופרטורים First, FirstOrDefault, Last ו- LastOrDefault אינם מעוררים שגיאה כשהשאילתה מחזירה יותר מפריט אחד.
לרוע המזל, האופרטורים Last ו- LastOrDefault אינם נתמכים ב- LINQ to SQL. עם זאת, תוכל בקלות להשלים את אותה התנהגות עם First וסדר מיון יורד. קטע הקוד הבא מראה כיצד לאחזר מבסיס הנתונים את הסקירה הישנה ביותר ואת הסקירה החדשה ביותר: var firstReview = (from r in myDataContext.Reviews
orderby r.Id
select r).First(); var lastReview = (from r in myDataContext.Reviews
orderby r.Id descending
select r).First();
המאמר נכתב ע"י www.ssw.co.il
בברכה,
נאור שלומי - סנאפשוט בניית אתרים בהתאמה אישית.
נייד:054-4889474
מייל:href="mailto:Naor@ssw.co.il" Naor@ssw.co.il">target="_blank">Naor@ssw.co.il
אתר:www.ssw.co.il