
ThenBy או ThenByDescending למיון משני בתוך קבוצות שווה-ערך.from עם שם משתנה ואחריו in עם שם האוסף, ואחר כך where, orderby ו-select.select new { ... } מחזיר אובייקטים עם השדות שנבחרו, בלי מחלקה ייעודית.הטקסט המלא של הדקות הראשונות בהרצאה «LINQ» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שראינו את החידושים שהתווספו ב-C-Sharp 3 ראינו שהחידוש האחרון בעצם זה שפת לינק או Language Integrated Query ובעצם הרבה חידושים שהוסיפו כמו var וכמו אנונימוס טייפ ואקסטנצ'ן מתוד הוסיפו אותם בכדי שנוכל שיהיה לנו את לינק.
לינק בנוי גם מחלק מהדברים האלה. אז אחרי שהכרנו את כל החידושים הקטנים האלה של C-Sharp 3 אנחנו יכולים לעבור ולראות מה זה לינק. אז קודם כל לינק זה סך הכל שפת שאילתות מובנית בתוך שפת C-Sharp שמאפשרת לנו לבצע שאילתות על קולקשנים ועוד על כל מיני דברים נוספים.
קודם כל מה זה שאילתה? שאילתה זה בקשה לקבלת מידע, בקשה למידע. יש לי איזשהו קולקשן, גדול או קטן, לא משנה, ואני רוצה להביא חלק מהנתונים ממנו, איזשהם נתונים מסוימים.
אז קודם כל בנו לנו סדרה של פונקציות, שהפונקציות האלה הן פונקציות Extensions, Extension Methods, שנבנו על סדרה של קולקשנים בסיסיים, או ליתר דיוק סדרה של אינטרפייסים בסיסיים של קולקשנים, אז מימשו אותם בקולקשנים בסיסיים.
לדוגמה, הוסיפו סדרה של פונקציות לקולקשן או לאינטרפייס iEnumerable, ואז מימשו אותם במי שיורש את iEnumerable, לדוגמה בליסט. וכעת אפשר לעשות שאילתות על ידי הפונקציות האלה עבור קולקשן של ליסט.
אז קודם כל בואו נסתכל על קטגוריות שונות שקיימות בלינק. לינק מחולק לסדרה של תתי קטגוריות. הקטגוריה הראשונה נקראת Link to Object.
Link to Object סך הכל אומר שניתן לבצע שאילתות לינק על קולקשנים. זה Link to Object. זה בדיוק מה שאמרנו מקודם עם הפונקציות שהוסיפו אותם לאינטרפייסים הבסיסיים ואנחנו כבר נכנסים לדוגמה ורואים איך עושים את זה.
הקטגוריה הבאה של לינק נקראת Link to XML. XML זה סך הכל מידע טקסטואלי שבנוי על ידי תגיות שמתארות מה המידע. יהיה לנו איזשהו מודול נפרד או קורס נפרד למעשה על XML ואז נבין יותר לעומק מה זה אומר.
אז יכול להיות לנו קובץ עם סיומת XML שמחזיק לנו המון נתונים. הנתונים ב-XML יושבים בהיררכיה מעין עץ כזה ואנחנו יכולים לטעון את כל הקובץ ולעשות עליו שאילתות.
הקטגוריה הבאה נקראת לינק to SQL. לינק to sql זה פשוט מאוד ביצוע שאילתות על קולקשנים שחזרו או שהגיעו ממסד נתונים sql server בלבד ולא מפוגע לבצע שאילתות על מידע שהגיע ממסדי נתונים אחרים כמו oracle כמו access וכולי יש לנו מסד נתונים שנקרא sql server של מייקרוסופט ניתן לקחת את המידע שבו
להפוך אותו לקולקשנים שמגיעים לפי שאופ ועליהם לבצע שאילתות. הקטגוריה הבאה נקראת "Link to Entities", ובשם אחר נקרא "Entity Framework".
כאן אנחנו יכולים לבצע שאילתות על מידע שמגיע מכל מסד נתונים שהוא. כל מסד נתונים שיש לו משהו שנקרא Provider של ADO.NET, כלומר טכנולוגיה ישנה יותר שנקראת ADO.NET, אם היא מסוגלת להתעסק עם מסד הנתונים הזה, אז גם Entity Framework מסוגלת לבצע שאילתות על קולקשנים שחזרו ממנו.
והקטגוריה האחרונה נקראת Link to Dataset. דאטה סט זה רכיב ששייך לטכנולוגיית ה-ADO.NET הישנה, שיכולה לגשת לדאטה בייס ולבצע עליו פעולות.
והרכיב הזה מסוגל להחזיק אוסף של טבלאות אצלנו בצד של האפליקציה. עכשיו, לינק טו דאטה סט מסוגל לעשות שאילתות על אוסף הטבלאות הזה.
מה אנחנו הולכים לראות כרגע בסרטון? בסרטון, במסגרת הסקופ של הסרטון עצמו, אנחנו הולכים להתעסק אך ורק עם לינק טו אובג'קט. יש לנו את הידע לגבי קולקשנים, אנחנו יכולים ליצור קולקשן, למלא אותו בנתונים, ואז לבצע שאילתות בשביל לבדוק כל מיני דברים שנמצאים בקולקשן.
לינק טו אקס-אמ-אל שייך לעולם האקס-אמ-אל וזה קורס נפרד. לינק טו אס-קיו-אל זו טכנולוגיה כבר שלא נתמכת יותר על ידי מייקרוסופט, כלומר אפשר כמובן לבנות דוגמאות בטכנולוגיה הזאת, אבל היא לא ממשיכה להשתדרג.
לינק טו אנטיטיז מחליפה אותה ולכן לא הייתי ממליץ להשקיע בללמוד לינק טו אס-קיו-אל, אלא לינק טו אנטיטיז, אבל זה שייך לקורס מסדי נתונים וזה גם כן לא הסקופ של המודל.
מודול הזה ו-Linked to Data Set כמובן גם שייך ל-ADO.NET ושייך לתחום מסדי הנתונים לכן ניתן לדבר עליו במודולים אחרים ששייכים למסדי נתונים.
אז בואו נצלול ונראה כל מיני דוגמאות שקשורות ל-Linked to Object. דבר ראשון בואו ניגש ונבנה איזושהי מחלקה שנוכל לפי המחלקה הזאת להגדיר איזשהו קולקשן.
ניקח מחלקה מאוד מאוד פשוטה בואו ניקח מחלקה שמתארת לנו נקודה אחת. פוינט, והמחלקה הזאת היא מכילה x ו-y. כמו כן, יש לנו פה איזשהו סיטור. אפילו אפשר בלי סיטור, כי יש לנו את הקונספט של Object Initializer.
ניקח אבל 2-String. נחזיר כאן String.Format של x ו-y. ויש לנו מחלקה שמתארת נקודה במימד.
אחלה. אז אנחנו יכולים עכשיו לחזור וליצור לעצמנו איזשהו קולקשן של נקודות כאלה נמלא את הקולקשן הזה ב-100 נקודות שונות וניקח נקודות בעלות ערכים רנדומליים אז יש לנו פה x ואת y ויש לנו כרגע קולקשן של points שמאותך לו בסדרה של נקודות רנדומליות לחלוטין כל נקודה יש לה x וy והערכים שלהם
הם בין 0 ל-100 כולל 0 לא כולל 100 כעת אנחנו רוצים לבצע איזושהי שאילתא זאת אומרת בקשה למידע אנחנו רוצים להביא את כל הנקודות שהx בוא נניח יותר גדול מ-50 סבבה איך אנחנו עושים את זה אז אם אנחנו נסתכל אנחנו נראה שיש בליסט המון פונקציות extension אתם יכולים לראות את האייקון שראינו אותו בעבר לגבי extension method גם כאן אנחנו רואים את המילה extension וחלק מהפונקציות האלה זה פונקציות ששייכות לתחום הלינק.
כל הפונקציות האלה באות ואומרות לנו אנחנו מסוגלים לעשות שאילתות על הקולקשן עצמו ולהחזיר לכם נתונים. נתחיל עם הפונקציה הראשונה שנקראת where.
פונקציית where אומרת לנו תגידו לי בבקשה איזה תנו לי איזושהי פונקציה בשביל שאני אדע איזה פריטים לבחור. where פשוט בוחרת לנו את הפריטים הדרושים.
איך אנחנו בדיוק אומרים ל-where איזה פריטים אנחנו רוצים? הרי אמרנו כרגע שאנחנו רוצים לבחור את כל ה-X'ים שגדולים יותר מ-50.
סבבה, אז איך בדיוק אנחנו אומרים את זה ל-where? איך זה יכול להיות שבנו פונקציה שיודעת לבחור מה שאנחנו רוצים?
אז בואו נסתכל ונראה שהפונקציה מקבלת משהו שנקרא predicate, זאת אומרת שזו פונקציה שמקבלת אובייקט פוינט ומחזירה בוליאן. אם היינו בונים פונקציה כזאת, כשמחזירה בוליה ונקראת is x larger than 50 נקבל פה point p ונחזיר האם p נקודה x יותר גדול מ-50 היינו יכולים לשלוח את הפונקציה is x larger than 50 לפונקציית where ומה שפונקציית where הייתה עושה במקרה הזה
זה רצה על האוסף הפנימי, הרי פונקציית where שייכת לליסט. אז פונקציית where פשוט מכילה לולאה בתוך עצמה, רצה על כל האוסף הפנימי, לוקחת כל אחד מפריטי האוסף שאנחנו רואים שהוא סוג point, ואת כל אחד מפריטי האוסף שולחת לפונקציה שהבאנו לה.
אז פונקציה שהבאנו לה פשוט מחזירה true אם אנחנו רוצים את הפריט הזה. הx יותר גדול מ-50 אנחנו מחזירים true אם חזר true מהפונקציה where שומרת בצד בתת רשימה את הפריט שעבורו חזר true אם חזר false where לא שומרת אותו בתת רשימה לכן בסופו של דבר where יכולה להחזיר לנו תת אוסף שימו לב שזה
inumerable של point בואו ניגש לכאן נגדיר ה-Enumerable של Point Results 1 ונקבל את כל מה שמוחזר מ-Where וכעת אנחנו יכולים לרוץ באיזושהי לולאה ולהציג את כל האוסף הזה בואו נרוץ ב-For Each Point P in Results 1 בואו נציג את P ונראה האם מה שחזר אכן כל ה-Xים יותר גדולים מ-50 נריץ את התוכנית ושימו לב שיש לנו כאן
כל מיני תוצאות שכל התוצאות האלה מכילות נקודה שהx שלה גדול מ-50. אנחנו יכולים פשוט לעבור אחד אחד ולראות שזה אכן נכון.
סבבה. אז יש לנו פה את הפונקציה הראשונה בעולם הלינק שנקראת where שמחזירה לנו תת אוסף. עכשיו לפני שנמשיך הלאה לפונקציות האחרות האם באמת היינו חייבים לבנות פה איזושהי פונקציה חיצונית ולתת אותה ל-where?
הרי where אומרת לנו תביאו לי פונקציה, אנחנו יכולים לראות את זה כאן, delegate מסוג func שמקבל point ומחזיר בולען. אם where אומרת לנו תביאו לי פונקציה, אנחנו חייבים להביא לה פונקציה.
אוקיי, אבל האם יש שיטה אחרת, האם זה היה חכם ללכת ולבנות פונקציה חיצונית במקום אחר בתוכנית רק בשביל הפעילות הקטנה הזאת שאני רוצה אותה רק בנקודה הזאת?
אז כמובן שיש לנו שיטות אחרות לעשות את זה, דוגמא למדה אקספרשן שלמדנו במסגרת הכלים של C-Sharp 3. לא באמת היינו צריכים לבנות פונקציה חיצונית, גם שימו לב מה השם שלה, שם מאוד מאוד ספציפי לפעילות מאוד ספציפית שאנחנו רוצים לבצע כרגע.
אז בואו נמחק את הפונקציה ונבנה אותה כלמדה אקספרשן. למדה אקספרשן אומרת לנו תביאו לי את הפרמטרים, זה יהיה p, ולאחר מכן תנו לי את גוף הפונקציה, זה יהיה p.x יותר גדול מ-50.
בגלל שיש לנו פה p כדאי שאת זה נעביר ל-item כדי שלא יהיה התנגשות עם ה-p. ושימו לב שאנחנו יכולים למחוק את הפונקציה הזאת, אין לנו צורך בה, וכתבנו פה למדה אקסטרשן ספציפית שזאת פונקציה אמיתית לגמרי ומלאה שכתבנו.
הנה הפרמטרים שהיא מקבלת, רק אחד.