PracticU

LINQ ל- Objects

בלי כתוביותעם כתוביות
PracticU › קורס ADO.NET - חיבור אתר למסד נתונים › LINQ ל- Objects
מילון מושגים:
LINQ - יכולת ב-.NET לכתוב שאילתות על אוספים ומקורות נתונים ישירות בתוך קוד C# בתחביר אחיד.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
C# - שפת תכנות מונחית עצמים של מיקרוסופט, המשמשת בעיקר לפיתוח יישומים על פלטפורמת .NET.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
תחביר - אוסף הכללים של שפת תכנות הקובעים כיצד לכתוב קוד תקין. הפרתם גורמת לשגיאת תחביר.
מסד נתונים - אוסף מאורגן של נתונים המאוחסן כך שאפשר לשמור, לחפש, לעדכן ולשלוף אותו ביעילות, לרוב באמצעות שפת שאילתות.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.

LINQ ל- Objects
הרצאה זו מציגה את LINQ to Objects: שאילתות בשפת C# על אוספים שנמצאים בזיכרון התוכנית, בתחביר שמשולב בשפה עצמה. ההרצאה נערכת באפליקציית קונסולה כדי להתרכז בתחביר בלבד.
השלבים העיקריים
1. רעיון LINQ: שאילתה נכתבת ב-C# בלי קשר למסד נתונים, ומופעלת על מערך או רשימה. התחביר מתחיל ב-from, ממשיך ב-where או order by, ומסתיים ב-select.
2. דוגמה למספרים: מציגים מספרים גדולים מ-10 בסדר עולה ויורד, וכן מספרים זוגיים שמוחזרים כמחרוזות. המילה var מאפשרת לקמפיילר לקבוע את הטיפוס של התוצאה.
3. FindAll ופרדיקט: בפונקציה FindAll מעבירים פונקציה שמחזירה true או false לכל פריט. אפשר להעביר שם של פונקציה, פונקציה אנונימית עם delegate, או ביטוי למבדה.
4. אוספי אובייקטים: מגדירים מחלקה Book עם שם, מחבר ומחיר, ומחפשים ספרים ששמם מכיל את המילה C#. ניתן לבחור רק חלק מהשדות ולקבל טיפוס אנונימי.
פקודות והגדרות
בביטוי למבדה מפרידים בין הפרמטר לגוף הפונקציה בעזרת החץ =>. כשהגוף הוא שורה אחת אין צורך במילת return או בנקודה פסיק. המרצה מציין שהמילה var נוחה, אבל המתכנת צריך להבין מה הטיפוס שמוחזר.
שימו לב
LINQ to Objects מתאים לחיפושים מקומיים על נתונים שכבר נטענו, ואינו מחליף חיפוש במסד נתונים כשמדובר בכמויות גדולות.
השיעור הבא בקורס: LINQ ל- SQL

פרקי ההרצאה: LINQ ל- Objects

  1. 00:00

    מהו LINQ

  2. 01:13

    אפשרויות העבודה של LINQ

  3. 03:55

    LINQ to Object בפרויקט Console

  4. 05:20

    הגדרת מערך ו-var

  5. 06:25

    תחביר השאילתה from where

  6. 08:34

    מיון עם order by

  7. 11:12

    שאילתה על List

  8. 12:13

    FindAll ו-Predicate

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

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

  1. 00:01

    אוקיי, אז אנחנו הולכים להיכנס לנושא שנקרא לינק. לינק פירושו Language Integrated Query, כלומר שפת שאילתות מובנית. מה זה אומר?

  2. 00:14

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

  3. 00:33

    אנחנו ראינו עד היום שאנחנו יכולים לבצע מסד נתונים ואז מ-c-sharp לבצע שאילתת sql לשלוח אותה למסד הנתונים מסד הנתונים מכיל בתוכו מנוע שמסוגל לפרש את שאילתת ה-sql לדעת מה אנחנו רוצים ממנו האם אנחנו רוצים להוסיף מידע לעדכן למחוק או להחזיר נתונים ולפיכך לבצע את השאילתה או לעדכן להוסיף למחוק או שהוא מחזיר לנו נתונים לאפליקציה המנוע שהשתמשנו איתו עד היום זה מנוע SQL שנמצא בתוך מסד

  4. 01:03

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

  5. 01:15

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

  6. 01:29

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

  7. 01:52

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

  8. 02:08

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

  9. 02:28

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

  10. 02:46

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

  11. 03:01

    דבר נוסף שיש לנו זה לינק to data set. אני יכול להביא ממסד הנתונים data set, שכמובן data set מחזיק לי מספר טבלאות כפי שראינו ב-idio.net, לבצע שאילתות מקומית על הדאטה סט בעזרת לינק והדבר הנוסף שיש לנו זה לינק טו אנטיטיז לינק טו אנטיטיז או בשם אחר אנטיטי פריימורק זה בעצם אפשרות דומה מאוד ללינק טו sql אבל לינק

  12. 03:27

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

  13. 03:47

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

  14. 03:58

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

  15. 04:11

    בשביל לבדוק את זה אנחנו קודם כל צריכים ללמוד את התחביר של לינק ואת הפונקציונליות השונה שקיימת בו ולכן הדבר הכי נוח לבצע זה לפתוח פרויקט מטיפוס Console Application.

  16. 04:23

    אז בואו נפתח פרויקט Console Application. פרויקט Console Application מכיל לי את האופציה לבצע קוד ורק לבדוק אותו בחלון דוס שחור שנפתח לי.

  17. 04:34

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

  18. 04:48

    אין פה user interface, זה לא אתר אינטרנט, זה לא תוכנה חלונאית, ורק תוכנה שמאפשרת לי לכתוב קוד, והיא נותנת לי חלון שחור שנקרא console, שמאפשר לי רק לראות את התוצאות שלי.

  19. 05:01

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

  20. 05:13

    במקרה הזה אנחנו הולכים ללמוד לינק to object. אוקיי, אז קודם כל בואו נגדיר לנו מערך חד-ממדי int array ונכניס לתוכו כל מיני מספרים.

  21. 05:30

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

  22. 05:43

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

  23. 06:10

    אינט X. אם הייתי בא ומכניס ל-X מחרוזת כלשהי X מבחינת המערכת עכשיו היה עובר להיות סטרינג אז var זה מאוד מאוד נוח לעבוד איתו מפני שאני יכול להכניס אליו כל דבר והמערכת בעצם תדע מה טיפוס הנתונים שלו.

  24. 06:28

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

  25. 06:40

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

  26. 06:54

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

  27. 07:06

    האוסף שלנו הוא array. לאחר מכן אני מגדיר את תנאי החיפוש. אני רוצה למצוא את כל המספרים שגדולים מ-10. אז יש לי פה את התנאי where ואז אני פונה לכל אחד מפרטי האוסף שמיוצג על ידי המשתנה שהמצאנו נם ואני רוצה שהשאילתה שלי תחזיר לי אך ורק מספרים שהם גדולים מ-10.

  28. 07:30

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

  29. 07:43

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

  30. 07:58

    עכשיו השאילתה הזאת מייצגת לי רק חלק מהנתונים, רק נתונים שגדולים מ-10, ואני בעזרת הפונקציה 2ra יכול להחזיר את התוצאות למערך חד-ממדי שנקרא לו results והוא יחזיק לי את התוצאות שחזרו.

  31. 08:16

    בואו נרוץ עליו ב-foreach אני רץ int item int results זה תוצאות שלי ואני רוצה להציג כל אחת מהתוצאות שחזרו אז אני אציג את ה-item בצורה כזאת וארד שורה בסוף בואו נריץ את זה ועכשיו אנחנו יכולים לראות שרק התוצאות האלה חזרו כי רק אלה מכל האוסף גדולים יותר מ-10.

  32. 08:47

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

  33. 09:12

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

  34. 09:23

    בואו נראה עוד דבר. נגדיר כאן עוד שאילתא, נקרא לה query2, ונגדיר from num in array, שוב פעם אני מתייחס למערך המקורי שיש לי where בואו נגיד num מודולו 2 ו-0 מה שאמרנו פה זה כמובן אני רוצה לגלות רק את המספרים שהם זוגיים.

  35. 10:00

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

  36. 10:19

    לכן אם אני עכשיו אגש ל query2 והגש ל-2ra אני בעצם יכול לראות ש-2ra כרגע לא מחזירה לי מערך של אינטים כמו מקודם אלא מחזירה לי מערך של סטרינגים. לכן אני יכול לקבל את זה למערך של סטרינגים נקרא לו results2 ולרוץ ולהציג את results2.

  37. 10:49

    for each הפעם string item in results2 תציג לי את אייטם בואו נבדוק ונראה כרגע שהוא מציג לי את הערכים האלה שהם מכרוזתיים, כל הערכים הזוגיים שהיו קיימים באוסף המקורי.

  38. 11:13

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

  39. 11:29

    בואו נפתח ליסט של אינט, נקרא לו my numbers ונכניס לתוכו ערכים אינטג'רים אחרים. בואו נכניס כל מיני מספרים וכעת נעשה חיפוש נוסף על הליסט הזאת.

  40. 11:56

    אז עכשיו אני יכול כמובן ללכת ל-VAR query 3 ולהתחיל להכניס שאילתת לינק שמסוגלת לבצע חיפוש אחר על האוסף הזה, אין שום בעיה. אבל בואו נלמד עוד דבר שקיים לנו ב-C-Sharp 3. אני יכול לגשת ל-My Numbers ולהסתכל על פונקציה שנקראת Find All.

  41. 12:25

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

  42. 12:56

    אול כמובן זה גם פונקציה שבנו לפני זמן רב כשבנו את הטיפוס הזה אבל יש פה משהו שהוא קצת לא הגיוני. איך זה יכול להיות ש-Find All תחפש משהו שאני רוצה כאשר זאת פונקציה שכבר קיימת וכבר כתבו אותה?

  43. 13:15

    משהו פה לא מסתדר. מה בדיוק כתבו בפונקציה שהיא תדע תמיד לחפש את מה שאני רוצה? אולי אני רוצה לחפש רק את המספרים שמתחלקים ב-7?

  44. 13:24

    אולי רק את אלה שמשחקים ב-19? אולי רק את הזוגיים? אולי אלה שגדולים מ-100? איך-Find All יודעת מה בדיוק אני רוצה לחפש וכך להחזיר לי, שימו לב מה היא מחזירה לי, היא מחזירה לי גם כן list של int, שמחזיק לי את התוצאות שאותם רציתי לחפש.

  45. 13:42

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

  46. 14:10

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

  47. 14:36

    שלה בכדי שפונקציית פיינד אול תקרא לה פונקציית פיינד אול מחזירה לי ליסט של אינט בואו נקרא לזה results 3. עכשיו אנחנו צריכים ללכת ולבנות את פונקציית isOk אז בואו נבנה פה פונקציה

לקורס המלא: קורס ADO.NET אונליין

ההרצאה הקודמת: מודל שכבות - Stored Procedures

ההרצאה הבאה: LINQ ל- SQL

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

  • LINQ
  • Game Objects
  • מערך של אובייקטים - Objects Array
  • שאילתת LINQ - על אוספים רגילים

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

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