PracticU

יירוט שאילתות
Intercepting Queries

בלי כתוביותעם כתוביות
PracticU › קורס Entity Framework Core - עבודה עם מסד נתונים בדוט-נט › יירוט שאילתות Intercepting Queries
מילון מושגים:
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
Entity Framework - ספריית מיקרוסופט שממפה בין אובייקטים בקוד לבין טבלאות במסד נתונים, ומאפשרת לעבוד עם הנתונים בלי לכתוב SQL ישיר.
פריימוורק - מסגרת תוכנה שמספקת מבנה וכלים מוכנים לפיתוח יישומים, כדי לחסוך כתיבת קוד חוזר.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.

יירוט שאילתות Intercepting Queries
Interceptor (מיירט) ב-Entity Framework Core הוא קטע קוד שרץ אוטומטית ברגע ש-Entity Framework מבצעת שאילתה בדאטאבייס. ההרצאה בונה שני מיירטים: אחד שמודד זמני ריצה ואחד שמדפיס את השאילתה.
בניית המיירטים
1. מחלקה: מוסיפים קובץ מחלקה בתיקיית Utilities. המחלקה DurationInterceptor יורשת מ-DbCommandInterceptor מ-Microsoft.EntityFrameworkCore.Diagnostics, וצריך גם using System.Data.Common.
2. שתי פונקציות override: ReaderExecuting נקראת לפני הביצוע בדאטאבייס, ו-ReaderExecuted אחריו.
3. מדידת זמן: בשדות פרטיים start ו-end מכניסים DateTime.Now לפני ואחרי. אחרי הביצוע מחשבים duration מסוג TimeSpan מהפרש הזמנים ומדפיסים TotalMilliseconds בצבע צהוב, ואז Console.ResetColor.
4. רישום: המיירט נרשם ברמת הקונטקסט, בפונקציה שבה כתוב UseSqlServer, דרך AddInterceptors. אפשר להעביר כמה מיירטים. בהרצה: כ-21 עד 22 אלפיות שנייה לשאילתה, ובהרצות נוספות 19 עד 20.
5. מיירט שני: LogQueryInterceptor נשאר עם ReaderExecuting בלבד, ומדפיס בירוק את Command.CommandText ואחריו קו הפרדה.
מה רואים
- ב-display all gifts מודפסת שאילתת select על הטבלה.
- ב-display one gift יש שאילתה עם where. מודפסים רק הפרמטרים שמחוברים לשאילתה, ולא הערך הסופי.
- ב-add gift מודפסת שאילתת insert into gifts שלקחה 31 אלפיות שנייה. לפניה Entity Framework מגדירה הגדרות גלובליות.
שימושים
אפשר להשאיר את המיירט דלוק או להפעיל אותו לפי הצורך. דרך CommandText אפשר גם לשנות שאילתה או לבטל אותה, אבל בדרך כלל משתמשים במיירטים לאבחון, בדיקות ותזמונים.
כעת אפשר לצפות בשאילתות ש-Entity Framework שולחת לדאטאבייס ולמדוד כמה זמן הן לוקחות.
השיעור הבא בקורס: בדיקת ביצועים עם SQL Profiler

פרקי ההרצאה: יירוט שאילתות Intercepting Queries

  1. 00:00

    מה זה Interceptor ב-EF Core

  2. 00:53

    יצירת מחלקת Interceptor למדידת זמן

  3. 01:35

    הורשה מ-DbCommandInterceptor

  4. 02:11

    override ל-ReaderExecuting ו-Executed

  5. 02:48

    מדידת זמני ההרצה

  6. 04:30

    רישום ה-interceptor בקונטקסט

  7. 05:41

    interceptor שמדפיס את השאילתה

תמלול ההרצאה: יירוט שאילתות Intercepting Queries

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

  1. 00:02

    ישנו דבר מעניין נוסף ש-Entity Framework Core מאפשרת לנו לבצע, וזה בנייה של משהו שנקרא Interceptor. Interceptor בעברית זה מיירט. To intercept something זה ליירט משהו.

  2. 00:18

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

  3. 00:33

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

  4. 00:42

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

  5. 00:55

    אני אצרף איזשהו קובץ קלאס אני אקרא לו interceptors ברבים כי יכול להיות לי אחד או יותר בואו נצרף אותו נטפל רגע במרחב השמות ומה שאנחנו רוצים לעשות זה לבנות בוא נניח אני אבנה קודם כל interceptor שפשוט מודד לי זמנים כמה זמן לוקח ל-ndt framework לבצע פעולה כזו או אחרת בואו נקרא ל-interceptor הזה רק לא interceptors ברבים אלא נקרא לו Duration Interceptor.

  6. 01:29

    אנחנו רוצים לרשת ממחלקה שנקראת db-command Interceptor. הנה היא כאן, אנחנו רואים שהיא מגיעה מ-entity framework core נקודת Diagnostics.

  7. 01:40

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

  8. 01:51

    אנחנו צריכים כאן בנוסף, רגע ניפטר מכל אלה, אנחנו צריכים בנוסף using system.data.common זה משהו שאנחנו חייבים לצרף אותו בצורה יזומה אחרת visual studio לא תמצא את מה שאנחנו מחפשים ומה שאנחנו רוצים לעשות זה to override ויש לנו אפשרות To Override שתי פונקציות, אחת זה Reader Executing והשנייה Override

  9. 02:22

    Reader Executed. Executing זה אומר אנטיטי פריימרוק עדיין לא ביצעה את הפעולה בדאטאבייס, היא הולכת לעשות. Executed היא כבר ביצעה, זה בעבר.

  10. 02:36

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

  11. 02:59

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

  12. 03:20

    בואו נקרא לו duration ונכניס לתוכו את ה-end פחות הסטארט. האופרטור המינוס בעצם נותן לנו time span, כמה זמן חלף.

  13. 03:31

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

  14. 03:52

    והנה יש לנו כאן את ההדפסה הזאת. בואו רק אולי נצבע אותה באיזשהו צבע אחר. נגדיר כאן console. foreground נגיד yellow ו-console.resetColor שיחזיר לנו את הצבע. ואז אנחנו נראה את זה קצת יותר בוהק על המסך.

  15. 04:12

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

  16. 04:42

    ויש לנו כאן את זה use sql server פה אנחנו אומרים לו תשתמש במסד הנתונים sql server אבל הפונקציה הזאת מאפשרת לנו to add interceptors כאן אנחנו יכולים פשוט לתת לו אובייקט מהduration interceptors שבנינו בצורה כזאת ועכשיו רשמנו אותו שימו לב שזה יכול לקבל מערך של אינטרספטורים גם בואו נריץ והנה יש לנו פה total מילי סקנדס לקח לו

  17. 05:12

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

  18. 05:38

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

  19. 06:06

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

לקורס המלא: קורס Entity Framework Core

ההרצאה הקודמת: הרצת שאילתת SQL Select - ב-Entity Framework Core

ההרצאה הבאה: בדיקת ביצועים עם SQL Profiler

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

  • יצירת תת-שאילתות ב-SQL
  • כתיבת שאילתות ל-MongoDB
  • שאילתות XML - יומן האירועים - Event Viewer

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

  • קורס דוט-נט - NET Core. - עם Rest API
  • קורס ASP.NET
  • קורס MVC
  • קורס Git ו-GitHub עם Visual Studio