PracticU

LINQ

בלי כתוביותעם כתוביות
PracticU › קורס תכנות מתקדם - #Advanced .NET C › LINQ
מילון מושגים:
LINQ - יכולת ב-.NET לכתוב שאילתות על אוספים ומקורות נתונים ישירות בתוך קוד C# בתחביר אחיד.
C# - שפת תכנות מונחית עצמים של מיקרוסופט, המשמשת בעיקר לפיתוח יישומים על פלטפורמת .NET.
SQL Server - מערכת ניהול מסדי נתונים יחסיים של מיקרוסופט, הנשלטת בשפת T-SQL.
ADO.NET - אוסף מחלקות ב-.NET לגישה למסדי נתונים, להרצת שאילתות ולעבודה עם התוצאות.
Entity Framework - ספריית מיקרוסופט שממפה בין אובייקטים בקוד לבין טבלאות במסד נתונים, ומאפשרת לעבוד עם הנתונים בלי לכתוב SQL ישיר.
בוליאני - סוג נתונים שיכול לקבל אחד משני ערכים בלבד: אמת (true) או שקר (false).
תחביר - אוסף הכללים של שפת תכנות הקובעים כיצד לכתוב קוד תקין. הפרתם גורמת לשגיאת תחביר.
קומפיילר - תוכנה שממירה קוד מקור שנכתב בשפת תכנות לקוד שהמחשב יכול להריץ, ומדווחת על שגיאות תחביר.

LINQ
LINQ, Language Integrated Query, היא שפת שאילתות מובנית בתוך C#, שמאפשרת לשאול שאלות על אוספים ועל מקורות מידע אחרים. השיעור מסביר מהם סוגי השאילתות ואיך כותבים אותן בשני תחביריים שונים.
סוגי LINQ
1. LINQ to Objects: שאילתות על אוספים שנמצאים בזיכרון, כמו רשימות. זה הנושא של השיעור.
2. LINQ to XML: שאילתות על מסמכי XML.
3. LINQ to SQL: שאילתות על מסד נתונים של SQL Server בלבד.
4. LINQ to Entities: שאילתות על מידע מכל מסד נתונים שיש לו ספק ADO.NET, בעזרת Entity Framework.
5. LINQ to DataSet: שאילתות על אוסף טבלאות שנמצא בצד האפליקציה.
שיטה ראשונה: שרשור מתודות
6. נקודת מוצא: מחלקה Point עם X ו-Y, וכמה עשרות נקודות רנדומליות ברשימה.
7. Where: מקבל פרדיקט, כלומר פונקציה שמחזירה בוליאני לכל פריט. הפריטים שהפרדיקט מחזיר להם true נשמרים בתת-אוסף. בדוגמה נבחרו נקודות שה-X שלהן גדול מ-50.
8. OrderBy ו-OrderByDescending: ממיינים לפי ערך שמחזירה פונקציה. ואחריו ThenBy או ThenByDescending למיון משני בתוך קבוצות שווה-ערך.
9. Select: קובע מה מוחזר מכל פריט. אפשר להחזיר את הפריט עצמו, ערך אחד, מחרוזת מעוצבת, או אובייקט חדש.
10. Take: מחזיר מספר פריטים מתחילת התוצאה.
11. שרשור: כל מתודה מקבלת את התוצאה של קודמתה, ולכן כותבים אותן בשרשרת אחת.
שיטה שנייה: תחביר דמוי SQL
12. מבנה: from עם שם משתנה ואחריו in עם שם האוסף, ואחר כך where, orderby ו-select.
13. תרגום: הקומפיילר ממיר את התחביר הזה לשרשור המתודות שמופיע בשיטה הראשונה. התוצאה זהה.
14. let: מגדיר משתנה זמני בתוך השאילתה, למשל משתנה לימיט שנשמר ומשמש בתנאי.
15. טיפוס אנונימי בתוצאה: select new { ... } מחזיר אובייקטים עם השדות שנבחרו, בלי מחלקה ייעודית.
בחירה בין שני התחביריים היא עניין של קריאות. שניהם מבצעים את אותה שאילתה.
השיעור הבא בקורס: תרגילים על LINQ

פרקי ההרצאה: LINQ

  1. 00:00

    מהו LINQ

  2. 01:58

    קטגוריות של LINQ

  3. 04:52

    התמקדות ב-LINQ TO OBJECT

  4. 06:09

    בניית COLLECTION של נקודות

  5. 09:02

    הפונקצייה WHERE

  6. 09:47

    שימוש ב-PREDICATE

  7. 13:54

    שאילתה עם Lambda Expression

תמלול ההרצאה: LINQ

הטקסט המלא של הדקות הראשונות בהרצאה «LINQ» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

    אחרי שראינו את החידושים שהתווספו ב-C-Sharp 3 ראינו שהחידוש האחרון בעצם זה שפת לינק או Language Integrated Query ובעצם הרבה חידושים שהוסיפו כמו var וכמו אנונימוס טייפ ואקסטנצ'ן מתוד הוסיפו אותם בכדי שנוכל שיהיה לנו את לינק.

  2. 00:27

    לינק בנוי גם מחלק מהדברים האלה. אז אחרי שהכרנו את כל החידושים הקטנים האלה של C-Sharp 3 אנחנו יכולים לעבור ולראות מה זה לינק. אז קודם כל לינק זה סך הכל שפת שאילתות מובנית בתוך שפת C-Sharp שמאפשרת לנו לבצע שאילתות על קולקשנים ועוד על כל מיני דברים נוספים.

  3. 00:56

    קודם כל מה זה שאילתה? שאילתה זה בקשה לקבלת מידע, בקשה למידע. יש לי איזשהו קולקשן, גדול או קטן, לא משנה, ואני רוצה להביא חלק מהנתונים ממנו, איזשהם נתונים מסוימים.

  4. 01:11

    אז קודם כל בנו לנו סדרה של פונקציות, שהפונקציות האלה הן פונקציות Extensions, Extension Methods, שנבנו על סדרה של קולקשנים בסיסיים, או ליתר דיוק סדרה של אינטרפייסים בסיסיים של קולקשנים, אז מימשו אותם בקולקשנים בסיסיים.

  5. 01:37

    לדוגמה, הוסיפו סדרה של פונקציות לקולקשן או לאינטרפייס iEnumerable, ואז מימשו אותם במי שיורש את iEnumerable, לדוגמה בליסט. וכעת אפשר לעשות שאילתות על ידי הפונקציות האלה עבור קולקשן של ליסט.

  6. 01:55

    אז קודם כל בואו נסתכל על קטגוריות שונות שקיימות בלינק. לינק מחולק לסדרה של תתי קטגוריות. הקטגוריה הראשונה נקראת Link to Object.

  7. 02:11

    Link to Object סך הכל אומר שניתן לבצע שאילתות לינק על קולקשנים. זה Link to Object. זה בדיוק מה שאמרנו מקודם עם הפונקציות שהוסיפו אותם לאינטרפייסים הבסיסיים ואנחנו כבר נכנסים לדוגמה ורואים איך עושים את זה.

  8. 02:29

    הקטגוריה הבאה של לינק נקראת Link to XML. XML זה סך הכל מידע טקסטואלי שבנוי על ידי תגיות שמתארות מה המידע. יהיה לנו איזשהו מודול נפרד או קורס נפרד למעשה על XML ואז נבין יותר לעומק מה זה אומר.

  9. 02:52

    אז יכול להיות לנו קובץ עם סיומת XML שמחזיק לנו המון נתונים. הנתונים ב-XML יושבים בהיררכיה מעין עץ כזה ואנחנו יכולים לטעון את כל הקובץ ולעשות עליו שאילתות.

  10. 03:04

    הקטגוריה הבאה נקראת לינק to SQL. לינק to sql זה פשוט מאוד ביצוע שאילתות על קולקשנים שחזרו או שהגיעו ממסד נתונים sql server בלבד ולא מפוגע לבצע שאילתות על מידע שהגיע ממסדי נתונים אחרים כמו oracle כמו access וכולי יש לנו מסד נתונים שנקרא sql server של מייקרוסופט ניתן לקחת את המידע שבו

  11. 03:37

    להפוך אותו לקולקשנים שמגיעים לפי שאופ ועליהם לבצע שאילתות. הקטגוריה הבאה נקראת "Link to Entities", ובשם אחר נקרא "Entity Framework".

  12. 03:52

    כאן אנחנו יכולים לבצע שאילתות על מידע שמגיע מכל מסד נתונים שהוא. כל מסד נתונים שיש לו משהו שנקרא Provider של ADO.NET, כלומר טכנולוגיה ישנה יותר שנקראת ADO.NET, אם היא מסוגלת להתעסק עם מסד הנתונים הזה, אז גם Entity Framework מסוגלת לבצע שאילתות על קולקשנים שחזרו ממנו.

  13. 04:20

    והקטגוריה האחרונה נקראת Link to Dataset. דאטה סט זה רכיב ששייך לטכנולוגיית ה-ADO.NET הישנה, שיכולה לגשת לדאטה בייס ולבצע עליו פעולות.

  14. 04:34

    והרכיב הזה מסוגל להחזיק אוסף של טבלאות אצלנו בצד של האפליקציה. עכשיו, לינק טו דאטה סט מסוגל לעשות שאילתות על אוסף הטבלאות הזה.

  15. 04:49

    מה אנחנו הולכים לראות כרגע בסרטון? בסרטון, במסגרת הסקופ של הסרטון עצמו, אנחנו הולכים להתעסק אך ורק עם לינק טו אובג'קט. יש לנו את הידע לגבי קולקשנים, אנחנו יכולים ליצור קולקשן, למלא אותו בנתונים, ואז לבצע שאילתות בשביל לבדוק כל מיני דברים שנמצאים בקולקשן.

  16. 05:14

    לינק טו אקס-אמ-אל שייך לעולם האקס-אמ-אל וזה קורס נפרד. לינק טו אס-קיו-אל זו טכנולוגיה כבר שלא נתמכת יותר על ידי מייקרוסופט, כלומר אפשר כמובן לבנות דוגמאות בטכנולוגיה הזאת, אבל היא לא ממשיכה להשתדרג.

  17. 05:30

    לינק טו אנטיטיז מחליפה אותה ולכן לא הייתי ממליץ להשקיע בללמוד לינק טו אס-קיו-אל, אלא לינק טו אנטיטיז, אבל זה שייך לקורס מסדי נתונים וזה גם כן לא הסקופ של המודל.

  18. 05:45

    מודול הזה ו-Linked to Data Set כמובן גם שייך ל-ADO.NET ושייך לתחום מסדי הנתונים לכן ניתן לדבר עליו במודולים אחרים ששייכים למסדי נתונים.

  19. 05:57

    אז בואו נצלול ונראה כל מיני דוגמאות שקשורות ל-Linked to Object. דבר ראשון בואו ניגש ונבנה איזושהי מחלקה שנוכל לפי המחלקה הזאת להגדיר איזשהו קולקשן.

  20. 06:14

    ניקח מחלקה מאוד מאוד פשוטה בואו ניקח מחלקה שמתארת לנו נקודה אחת. פוינט, והמחלקה הזאת היא מכילה x ו-y. כמו כן, יש לנו פה איזשהו סיטור. אפילו אפשר בלי סיטור, כי יש לנו את הקונספט של Object Initializer.

  21. 06:40

    ניקח אבל 2-String. נחזיר כאן String.Format של x ו-y. ויש לנו מחלקה שמתארת נקודה במימד.

  22. 07:12

    אחלה. אז אנחנו יכולים עכשיו לחזור וליצור לעצמנו איזשהו קולקשן של נקודות כאלה נמלא את הקולקשן הזה ב-100 נקודות שונות וניקח נקודות בעלות ערכים רנדומליים אז יש לנו פה x ואת y ויש לנו כרגע קולקשן של points שמאותך לו בסדרה של נקודות רנדומליות לחלוטין כל נקודה יש לה x וy והערכים שלהם

  23. 08:15

    הם בין 0 ל-100 כולל 0 לא כולל 100 כעת אנחנו רוצים לבצע איזושהי שאילתא זאת אומרת בקשה למידע אנחנו רוצים להביא את כל הנקודות שהx בוא נניח יותר גדול מ-50 סבבה איך אנחנו עושים את זה אז אם אנחנו נסתכל אנחנו נראה שיש בליסט המון פונקציות extension אתם יכולים לראות את האייקון שראינו אותו בעבר לגבי extension method גם כאן אנחנו רואים את המילה extension וחלק מהפונקציות האלה זה פונקציות ששייכות לתחום הלינק.

  24. 08:58

    כל הפונקציות האלה באות ואומרות לנו אנחנו מסוגלים לעשות שאילתות על הקולקשן עצמו ולהחזיר לכם נתונים. נתחיל עם הפונקציה הראשונה שנקראת where.

  25. 09:11

    פונקציית where אומרת לנו תגידו לי בבקשה איזה תנו לי איזושהי פונקציה בשביל שאני אדע איזה פריטים לבחור. where פשוט בוחרת לנו את הפריטים הדרושים.

  26. 09:33

    איך אנחנו בדיוק אומרים ל-where איזה פריטים אנחנו רוצים? הרי אמרנו כרגע שאנחנו רוצים לבחור את כל ה-X'ים שגדולים יותר מ-50.

  27. 09:45

    סבבה, אז איך בדיוק אנחנו אומרים את זה ל-where? איך זה יכול להיות שבנו פונקציה שיודעת לבחור מה שאנחנו רוצים?

  28. 09:54

    אז בואו נסתכל ונראה שהפונקציה מקבלת משהו שנקרא predicate, זאת אומרת שזו פונקציה שמקבלת אובייקט פוינט ומחזירה בוליאן. אם היינו בונים פונקציה כזאת, כשמחזירה בוליה ונקראת is x larger than 50 נקבל פה point p ונחזיר האם p נקודה x יותר גדול מ-50 היינו יכולים לשלוח את הפונקציה is x larger than 50 לפונקציית where ומה שפונקציית where הייתה עושה במקרה הזה

  29. 10:43

    זה רצה על האוסף הפנימי, הרי פונקציית where שייכת לליסט. אז פונקציית where פשוט מכילה לולאה בתוך עצמה, רצה על כל האוסף הפנימי, לוקחת כל אחד מפריטי האוסף שאנחנו רואים שהוא סוג point, ואת כל אחד מפריטי האוסף שולחת לפונקציה שהבאנו לה.

  30. 11:08

    אז פונקציה שהבאנו לה פשוט מחזירה true אם אנחנו רוצים את הפריט הזה. הx יותר גדול מ-50 אנחנו מחזירים true אם חזר true מהפונקציה where שומרת בצד בתת רשימה את הפריט שעבורו חזר true אם חזר false where לא שומרת אותו בתת רשימה לכן בסופו של דבר where יכולה להחזיר לנו תת אוסף שימו לב שזה

  31. 11:38

    inumerable של point בואו ניגש לכאן נגדיר ה-Enumerable של Point Results 1 ונקבל את כל מה שמוחזר מ-Where וכעת אנחנו יכולים לרוץ באיזושהי לולאה ולהציג את כל האוסף הזה בואו נרוץ ב-For Each Point P in Results 1 בואו נציג את P ונראה האם מה שחזר אכן כל ה-Xים יותר גדולים מ-50 נריץ את התוכנית ושימו לב שיש לנו כאן

  32. 12:27

    כל מיני תוצאות שכל התוצאות האלה מכילות נקודה שהx שלה גדול מ-50. אנחנו יכולים פשוט לעבור אחד אחד ולראות שזה אכן נכון.

  33. 12:40

    סבבה. אז יש לנו פה את הפונקציה הראשונה בעולם הלינק שנקראת where שמחזירה לנו תת אוסף. עכשיו לפני שנמשיך הלאה לפונקציות האחרות האם באמת היינו חייבים לבנות פה איזושהי פונקציה חיצונית ולתת אותה ל-where?

  34. 13:06

    הרי where אומרת לנו תביאו לי פונקציה, אנחנו יכולים לראות את זה כאן, delegate מסוג func שמקבל point ומחזיר בולען. אם where אומרת לנו תביאו לי פונקציה, אנחנו חייבים להביא לה פונקציה.

  35. 13:23

    אוקיי, אבל האם יש שיטה אחרת, האם זה היה חכם ללכת ולבנות פונקציה חיצונית במקום אחר בתוכנית רק בשביל הפעילות הקטנה הזאת שאני רוצה אותה רק בנקודה הזאת?

  36. 13:38

    אז כמובן שיש לנו שיטות אחרות לעשות את זה, דוגמא למדה אקספרשן שלמדנו במסגרת הכלים של C-Sharp 3. לא באמת היינו צריכים לבנות פונקציה חיצונית, גם שימו לב מה השם שלה, שם מאוד מאוד ספציפי לפעילות מאוד ספציפית שאנחנו רוצים לבצע כרגע.

  37. 13:58

    אז בואו נמחק את הפונקציה ונבנה אותה כלמדה אקספרשן. למדה אקספרשן אומרת לנו תביאו לי את הפרמטרים, זה יהיה p, ולאחר מכן תנו לי את גוף הפונקציה, זה יהיה p.x יותר גדול מ-50.

  38. 14:20

    בגלל שיש לנו פה p כדאי שאת זה נעביר ל-item כדי שלא יהיה התנגשות עם ה-p. ושימו לב שאנחנו יכולים למחוק את הפונקציה הזאת, אין לנו צורך בה, וכתבנו פה למדה אקסטרשן ספציפית שזאת פונקציה אמיתית לגמרי ומלאה שכתבנו.

  39. 14:42

    הנה הפרמטרים שהיא מקבלת, רק אחד.

לקורס המלא: קורס תכנות מתקדם ב‑#C ודוט-נט

ההרצאה הקודמת: תרגילים על חידושים ב-C# ver 3

ההרצאה הבאה: תרגילים על LINQ

הרצאות קשורות מקורסים אחרים

  • LINQ ל- Objects
  • שאילתת LINQ - על אוספים רגילים

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס WCF - תקשורת למתקדמים בדוט-נט