
הטקסט המלא של הדקות הראשונות בהרצאה «LINQ ל- Objects» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אוקיי, אז אנחנו הולכים להיכנס לנושא שנקרא לינק. לינק פירושו Language Integrated Query, כלומר שפת שאילתות מובנית. מה זה אומר?
זה אומר שאנחנו הולכים לבצע שאילתות, אבל בשפה שהיא מובנית אינטגרייטד בתוך שפת C-Sharp. בתוך שפת C-Sharp מ-2008 הכניסו מילים שמאפשרות לנו לעשות שאילתות על כל מיני דברים.
אנחנו ראינו עד היום שאנחנו יכולים לבצע מסד נתונים ואז מ-c-sharp לבצע שאילתת sql לשלוח אותה למסד הנתונים מסד הנתונים מכיל בתוכו מנוע שמסוגל לפרש את שאילתת ה-sql לדעת מה אנחנו רוצים ממנו האם אנחנו רוצים להוסיף מידע לעדכן למחוק או להחזיר נתונים ולפיכך לבצע את השאילתה או לעדכן להוסיף למחוק או שהוא מחזיר לנו נתונים לאפליקציה המנוע שהשתמשנו איתו עד היום זה מנוע SQL שנמצא בתוך מסד
הנתונים. לינק זה בעצם מעין אפשרות לבצע שאילתא אבל בצד של C-Sharp, בלי קשר למסד נתונים. מה אנחנו יכולים לעשות עם לינק?
ללינק יש מספר אפשרויות עבודה. ראשית, קיים דבר שנקרא לינק טו אובג'קט. לינק טו אובג'קט מאפשר לי לקחת איזשהו קולקשן מקומי שקיים אצלי בתוכנה.
נניח אוסף של עובדים, אוסף של לקוחות או אפילו סתם אוסף של אינטג'רים. לקחת את האובייקט אוסף הזה שמכיל מספר פריטים ולבצע עליו מקומית שאילתה בתוך C-Sharp בלי לגשת לשום מסד נתונים כי גם במקרה הזה אין לי מסד נתונים יש לי רק קולקשן ואז אני יכול לעשות שאילתות כאילו שהקולקשן הזה הוא מסד נתונים.
אפשרות נוספת זה לינק טו SQL. לינק טו SQL מאפשר לבצע שאילתות על אובייקטים שחוזרים ממסד הנתונים SQL Server בלבד. לינק טו SQL לא מסוגל לבצע שום דבר על מסד הנתונים אחרים.
SQL Server זה מסד נתונים של מייקרוסופט ולכן הם בנו עבורו אפשרות לבצע פעולות ושאילתות גם כן מקומית בצד של האפליקציה שלנו. זאת אומרת שאנחנו יכולים להביא לאפליקציה שלנו אובייקטים שהם מתארים קולקשנים ממסד הנתונים ולעבוד מקומית על הקולקשנים הללו.
לינק טו SQL זה עוד אופציה שאפשר לבצע בעזרת לינק שבה יש לי קובץ XML. קובץ XML זה בעצם קובץ שמחזיק לי נתונים בעזרת מידע טקסטואלי והנתונים נמצאים בקובץ הטקסטואלי הזה בעזרת תגיות.
התפקיד של הקובץ הזה זה להחזיק מידע. אני מסוגל לבצע לינק על הנתונים האלה, כלומר פעילויות של שאילתות על קובץ ה-XML על ידי זה שאני טוען אותו לזיכרון בצד של התוכנה ועובד עליו.
דבר נוסף שיש לנו זה לינק to data set. אני יכול להביא ממסד הנתונים data set, שכמובן data set מחזיק לי מספר טבלאות כפי שראינו ב-idio.net, לבצע שאילתות מקומית על הדאטה סט בעזרת לינק והדבר הנוסף שיש לנו זה לינק טו אנטיטיז לינק טו אנטיטיז או בשם אחר אנטיטי פריימורק זה בעצם אפשרות דומה מאוד ללינק טו sql אבל לינק
טו אנטיטיז היא מכילה אופציה גם לגשת למסדי נתונים אחרים כמו רקל לדוגמה או כל מיני מסדי נתונים אחרים שתומכים בזה ואז אנחנו יכולים גם כאן לבצע שאילתות על אובייקטים שחוזרים למסד הנתונים ובעצם מעין הרחבה ללינק טו sql והיא מכילה עוד כל מיני אופציות נוספות.
אז אנחנו עכשיו הולכים לראות כל אחת מהשיטות האלה, בכדי שתהיה לנו את היכולת לבצע שאילתות גם על דברים שהם לא רק מסעד נתונים. אנחנו הולכים להתחיל מ-link to object.
בואו נניח שיש לנו אוסף מסוים של אובייקטים, בואו ניקח את האוסף הכי פשוט, אוסף של אינטג'יירים. יש לי מערך חד-ממדי שמחזיק לי כל מיני מספרים, ואני רוצה לבצע פעולות על המערך הזה.
בשביל לבדוק את זה אנחנו קודם כל צריכים ללמוד את התחביר של לינק ואת הפונקציונליות השונה שקיימת בו ולכן הדבר הכי נוח לבצע זה לפתוח פרויקט מטיפוס Console Application.
אז בואו נפתח פרויקט Console Application. פרויקט Console Application מכיל לי את האופציה לבצע קוד ורק לבדוק אותו בחלון דוס שחור שנפתח לי.
אז בואו נפתח את הפרויקט הזה. אם אני כרגע מדפיף משהו על המסך, יש לי את הפונקציה console.writeline, היי, אני מריץ את התוכנית, ואני רואה את ההאי מוצג לי על חלון שחור.
אין פה user interface, זה לא אתר אינטרנט, זה לא תוכנה חלונאית, ורק תוכנה שמאפשרת לי לכתוב קוד, והיא נותנת לי חלון שחור שנקרא console, שמאפשר לי רק לראות את התוצאות שלי.
פרויקט כזה זה פרויקט הכי נוח לביצוע בדיקות או ללמוד תחבירים שונים, בגלל שאני לא מתעסק פה עם UI או עם אתר אינטרנט, אני רק רוצה ללמוד את התחביר של לינק.
במקרה הזה אנחנו הולכים ללמוד לינק to object. אוקיי, אז קודם כל בואו נגדיר לנו מערך חד-ממדי int array ונכניס לתוכו כל מיני מספרים.
יש לנו פה מספיק מספרים, בואו נוריד פה את הפסיק המיותר, פקודה פסיק, ויש לנו כרגע מערך שאני רוצה לבצע עליו שאילתא כאילו שהמערך הזה היה במסד נתונים.
אז איך אני מבצע את זה? אז ראשית ישנו משתנה או טיפוס נתונים שנקרא var. טיפוס נתונים שנקרא var זה טיפוס מאוד מיוחד שהתווסף ב-2008, אבל אני מסוגל לבצע דבר כזה אני מכניס אליו איזה שהוא משתנה ומעכשיו והלאה מבחינת המערכת ה-X הזה מזהה שהוא אינטג'ר כי 12 זה טיפוס אינט ולכן אני רואה כאן באינטלי סנס גם שהוא כותב לי
אינט X. אם הייתי בא ומכניס ל-X מחרוזת כלשהי X מבחינת המערכת עכשיו היה עובר להיות סטרינג אז var זה מאוד מאוד נוח לעבוד איתו מפני שאני יכול להכניס אליו כל דבר והמערכת בעצם תדע מה טיפוס הנתונים שלו.
אז אנחנו רוצים לבצע שאילתה ובואו נפתח משתנה שנקרא query ולתוכו אני רק מייצג שאילתה מסוימת שאני רוצה שהיא תעבוד על המערך עצמו.
אז מה התחביר של השאילתה? תחביר של השאילתה אומר דבר כזה אני מגדיר את המילה from וממציא שם של משתנה ששם המשתנה הזה בעצם מתייחס לכל אחד מפריטי האוסף.
אם האוסף שלי מחזיק מספרים אז הגיוני ששם המשתנה יהיה num אבל אני יכול לתת לו כל שם אחר. לאחר מכן אני כותב את המילה השמורה in ואז מאיזה אוסף אני רוצה לבצע עליו את השאילתה.
האוסף שלנו הוא array. לאחר מכן אני מגדיר את תנאי החיפוש. אני רוצה למצוא את כל המספרים שגדולים מ-10. אז יש לי פה את התנאי where ואז אני פונה לכל אחד מפרטי האוסף שמיוצג על ידי המשתנה שהמצאנו נם ואני רוצה שהשאילתה שלי תחזיר לי אך ורק מספרים שהם גדולים מ-10.
אז בואו נבדוק את זה. אני קודם כל רוצה לבצע בחירה ואני אומר לו מה אני רוצה לבחור. ואני רוצה לבחור את כל אחד מהפריטים שעונים על הכרית היום חיפוש.
עכשיו אני יכול לקחת את השאילתה שלי ולהפוך את התוצאות לכל דבר אחר. לדוגמה אני יכול להפוך את התוצאות ל-integer, מערך אינטג'רים ליתר דיוק.
עכשיו השאילתה הזאת מייצגת לי רק חלק מהנתונים, רק נתונים שגדולים מ-10, ואני בעזרת הפונקציה 2ra יכול להחזיר את התוצאות למערך חד-ממדי שנקרא לו results והוא יחזיק לי את התוצאות שחזרו.
בואו נרוץ עליו ב-foreach אני רץ int item int results זה תוצאות שלי ואני רוצה להציג כל אחת מהתוצאות שחזרו אז אני אציג את ה-item בצורה כזאת וארד שורה בסוף בואו נריץ את זה ועכשיו אנחנו יכולים לראות שרק התוצאות האלה חזרו כי רק אלה מכל האוסף גדולים יותר מ-10.
אני מסוגל גם לבוא ולומר דבר כזה order by אני רוצה לבצע מיון לפי המשתנה שחוזר אוטומטית המיון התבצע בסדר עולה. אם הייתי מבצע אורדר ביי דיסנדינג, לא דצימל, דיסנדינג, המיון היה מתבצע בסדר יורד, אני רואה קודם כל שישים וחמש, שלושים וארבע, עשרים ושלוש.
אז אני מסוגל גם לומר לשאילתא, אל תחזירי לי רק את המספרים, אלא תמייני אותם בסדר עולה או בסדר יורד. אז זה דבר אחד שיכולנו לעשות עם לינק טו אובג'קט.
בואו נראה עוד דבר. נגדיר כאן עוד שאילתא, נקרא לה query2, ונגדיר from num in array, שוב פעם אני מתייחס למערך המקורי שיש לי where בואו נגיד num מודולו 2 ו-0 מה שאמרנו פה זה כמובן אני רוצה לגלות רק את המספרים שהם זוגיים.
נמיין אותם לפי num ואני יכול לבחור משהו אחר כלומר אני יכול לבחור טיפוס נתונים אחר לדוגמה בואו נבחר num שווה ונשרשר אותו עם num. הדבר שבחרתי כאן זה בעצם סטרינג זה לא אינטג'ר.
לכן אם אני עכשיו אגש ל query2 והגש ל-2ra אני בעצם יכול לראות ש-2ra כרגע לא מחזירה לי מערך של אינטים כמו מקודם אלא מחזירה לי מערך של סטרינגים. לכן אני יכול לקבל את זה למערך של סטרינגים נקרא לו results2 ולרוץ ולהציג את results2.
for each הפעם string item in results2 תציג לי את אייטם בואו נבדוק ונראה כרגע שהוא מציג לי את הערכים האלה שהם מכרוזתיים, כל הערכים הזוגיים שהיו קיימים באוסף המקורי.
אוקיי, אחרי שראינו את זה בואו נראה עוד דברים שאפשר לבצע על לינק. בואו נפתח כרגע, עושים פה איזה קו הפרדה, נפתח כרגע אובייקט אוסף אחר ונראה שאפשר לעבוד גם על אובייקטי אוסף אחרים.
בואו נפתח ליסט של אינט, נקרא לו my numbers ונכניס לתוכו ערכים אינטג'רים אחרים. בואו נכניס כל מיני מספרים וכעת נעשה חיפוש נוסף על הליסט הזאת.
אז עכשיו אני יכול כמובן ללכת ל-VAR query 3 ולהתחיל להכניס שאילתת לינק שמסוגלת לבצע חיפוש אחר על האוסף הזה, אין שום בעיה. אבל בואו נלמד עוד דבר שקיים לנו ב-C-Sharp 3. אני יכול לגשת ל-My Numbers ולהסתכל על פונקציה שנקראת Find All.
פונקציית Find All אומרת לי תביא לי Predicate, של אינט קודם כל מה זה פרדיקייט פרדיקייט זה טיפוס נתונים שמסוגל להצביע על פונקציה פונקציה חיצונית מה הרעיון בפיינד אול נמברס או יותר נכון מיי נמברס זה אובייקט מטיפוס ליסט של אינט והיא מחזיקה לאינטג'רים מיי נמברס בגלל שהוא ליסט ליסט זה טיפוס שכבר בנו אותו לפני זמן רב פיינד
אול כמובן זה גם פונקציה שבנו לפני זמן רב כשבנו את הטיפוס הזה אבל יש פה משהו שהוא קצת לא הגיוני. איך זה יכול להיות ש-Find All תחפש משהו שאני רוצה כאשר זאת פונקציה שכבר קיימת וכבר כתבו אותה?
משהו פה לא מסתדר. מה בדיוק כתבו בפונקציה שהיא תדע תמיד לחפש את מה שאני רוצה? אולי אני רוצה לחפש רק את המספרים שמתחלקים ב-7?
אולי רק את אלה שמשחקים ב-19? אולי רק את הזוגיים? אולי אלה שגדולים מ-100? איך-Find All יודעת מה בדיוק אני רוצה לחפש וכך להחזיר לי, שימו לב מה היא מחזירה לי, היא מחזירה לי גם כן list של int, שמחזיק לי את התוצאות שאותם רציתי לחפש.
אז למעשה פיינד און לעולם לא יכולה לדעת מה אני מחפש ולכן מה שהיא אומרת לי זה דבר כזה תביא לי פונקציה שמקבלת אינטג'ר אני ארוץ על כל האוסף בעצמי ואני אשלח לכל אחד מהפריטים של האוסף את הפריט עצמו אני אשלח לפונקציה שלך את הפריט עצמו מהאוסף כל אחד מהפריטים ואתה תגיד לי אם הפריט הזה והפריט שאתה מחפש כן או לא אם כן פשוט תחזיר לי true ואני אוסיף
אותו לאוסף שאני הולכת להחזיר אם הפריט הזה לא מתאים לך תחזיר לי פולס ואני לא אוסיף אותו לכן מה שאנחנו צריכים לתת לפרדיקייט או יותר נכון לפונקציה פיינד אול זה שם של פונקציה בוא נגיד שנקרא לפונקציה הזאתי איז אוקיי שימו לב אני נתתי פה רק את השם של הפונקציה שתכף אנחנו נבנה אותה בלי סוגריים אני לא הולך לקרוא לפונקציה בעצמי אני רק נותן את השם
שלה בכדי שפונקציית פיינד אול תקרא לה פונקציית פיינד אול מחזירה לי ליסט של אינט בואו נקרא לזה results 3. עכשיו אנחנו צריכים ללכת ולבנות את פונקציית isOk אז בואו נבנה פה פונקציה