Browse by Tags
All Tags »
LINQ to SQL (
RSS)
נניח שיש לכם טבלה, עם עמודה הכוללת מספרים שלמים (int).באפליקציה שלכם, שלצורך העניין, משתמשת נניח ב LINQ to SQL או ADO.NET Entity Framework, אתם רוצים לקבל את הממוצע של העמודה הזאת. אתם אומרים לעצמכם שזה לא אמור להיות מורכב בכלל. יש Extension Method לאגרגרציה של נתונים, אחת מהם היא Average. אתם כותבים אפליקציה פשוטה שמריצה אותה ואמורה לעשות את הממוצע של המספרים 1,1,2. התוצאה המצופה היא אחד ושליש. אתם מקבלים אחד. למה? ההסבר פשוט מאד: משפט ה SQL שנוצר כתוצאה משימוש ב Average משתמש בפונקציית T-SQL בשם...
בפוסט הקודם הצגתי את LINQ2DQLDTOCreator , אפליקציה קטנה שמייצרת Data Transfer Objects על בסיס LINQ to SQL Data Classes. היום ביצעתי קצת שיפורים באפליקציה והרחבתי אותה כך שהיא תייצר DTO’s גם ממודל של ADO.NET Entity Framework . האפליקציה הנוכחית כוללת את כל היכולות של האפליקציה הקודמת. כלומר, עדיין ניתן לייצר DTO’s על בסיס LINQ to SQL Data Classes. אבל, עכשיו האפליקציה גם תייצר DTO’s על בסיס entities, כלומר מחלקות עם EdmEntityTypeAttribute. בנוסף, כאשר עובדים מול ADO.NET Entity Framework האפליקציה...
הקדמה באחד הפוסטים הקודמים כתבתי על Data Transfer Objects והשימוש בהם לעבודה נכונה ונוחה עם LINQ to SQL ו- ADO.NET Entity Framework. בין התגובות שקיבלתי בפורום “תכנות .NET” בתפוז שבתגובה לשאלה שעלתה בו פורסם הפוסט, עלה העניין שלמרות שמדובר בכתיבה יותר נוחה, היא דורשת למעשה עבודה כפולה בהתחלה, וגם ציינתי זאת בפוסט. כשמתחילים לכתוב, יש צורך לכתוב DTO נפרד לכל אחת מהישויות עם תחילת העבודה, וגם בד”כ לכתוב מתודות שמבצעות העברה בין הDTO לאובייקט שנמצא ב DAL (האובייקט שמופה ע”י הORM) ולהיפך – לכתוב מתודה...
כשעובדים מול LINQ to SQL או ADO.NET Entities Framework, אנחנו עובדים הרבה מאד מול אובייקט ה DataContext / Entities. דוגמא מאד נפוצה בדוגמאות ובמדריכים של הטכנולוגיות הללו היא ליצור מופע של המודל בכל מתודה וכל פעם שמשתמשים בו. למשל: 1: public static void Method1() 2: { 3: using (var data = new DataClassesDataContext()) 4: { 5: //Code 6: } 7: } 8: public static void Method2() 9: { 10: using (var data = new DataClassesDataContext()) 11: { 12: //Code 13: } 14: } וכך יש הרבה מתודות, כל אחת עושה new DataClassesDataContext...
כאשר מוסיפים שורה לטבלה המכילה איזושהי עמודה בשם ID שמוגדרת, לצורך העניין, כ Primary Key, פעמים רבות נרצה לקבל מיד אחרי הוספת הרשומה את ה ID שהוקצה לה. באמצעות T-SQL, זה היה נעשה עם SCOPE_IDENTIFY(), בצורה הזאת: 1: SELECT SCOPE_IDENTIFY() AS [NewID] זה היה מגיע לאחר ה INSERT, היינו מקבלים את הID וכולם היו שמחים ומאושרים. היום ראיתי דוגמאת קוד שבה מיד לאחר הוספת השורה ב LINQ to SQL וביצוע SubmitChanges, הולכים לבטלה ושולפים את השורה האחרונה בה כדי לקבל את הID. בסופו של דבר, התהליך הזה מיותר. ברגע...
במצבים מסויימים, נרצה לעשות serialization לאיזשהם אובייקטים שיוצרו ע"י LINQ to SQL. במילים אחרות, לקחת את האובייקטים שמופו מהטבלאות ולעשות להם סריאליזציה, למשל, כדי לשלוח אותם במסגרת Web Service. השגיאה עליה אני מדבר, תקרה בעיקר באובייקטים שמופו שיש להם realationships עם אובייקטים אחרים. ה Exception, ייראה בערך ככה: System.InvalidOperationException: A circular reference was detected while serializing an object of type BL.User. השגיאה הזאת נובעת, בגלל הצורה שבה ממומשים ה realationships בין האובייקטים...
במצבים מסויימים, נרצה לעשות serialization לאיזשהם אובייקטים שיוצרו ע"י LINQ to SQL. במילים אחרות, לקחת את האובייקטים שמופו מהטבלאות ולעשות להם סריאליזציה, למשל, כדי לשלוח אותם במסגרת Web Service. השגיאה עליה אני מדבר, תקרה בעיקר באובייקטים שמופו שיש להם realationships עם אובייקטים אחרים. ה Exception, ייראה בערך ככה: System.InvalidOperationException: A circular reference was detected while serializing an object of type BL.User. השגיאה הזאת נובעת, בגלל הצורה שבה ממומשים ה realationships בין האובייקטים...
דמיינו לכם מצב תיאורטי. יש לכם מתודה, שהתפקיד שלה הוא לעדכן מסד נתונים שעובד עם LINQ to SQL. אתם רוצים לקבל איזשהו אובייקט שאמור להחליף ישות קיימת ב DB. למשל, יש לנו את האובייקט User שמציין ישות מהDB, ואנחנו רוצים מתודה שתקבל אובייקט User שהוא זה שקיים עכשיו ואובייקט User שהוא החדש, שאמור להחליף אותו, ואנחנו רוצים לעדכן באמצעות LINQ to SQL. בכל הדוגמאות, רואים שאתה משנה את ה properties של האובייקט בתוך ה context של ה DataContext, וכאשר אתה עושה SubmitChanges מזוהים השינויים והעדכון מתבצע. הדבר הזה...
LINQ to SQL הוא כלי מאד נוח. ממש נוח. אבל, יש לו כמה מגבלות, והוא לא תמיד מאד חכם. בואו נניח שיש לנו בדטאבייס איזשהו stored procedure, נניח, שמו X. כאשר, ה SP הזה, בסיומו, מריץ איזשהו משפט SELECT, שמחזיר ערכים, שמולם אני רוצה לעבוד מהקוד. כאשר אני מוסיף את הSP ל L2SQL, בתהליך המיפוי, נוצר לי אובייקט בשם XResults, שמייצג את מבנה התוצאות שחוזר, ואיתו אפשר לעבוד. עכשיו, בואו נניח שיש לנו Stored Procedure קצת יותר מסובך. כזה שבאמצע, יוצר איזושהי טבלה זמנית, ממלא אותה בנתונים, בסיומו שולף ממנה נתונים...
LINQ to SQL זה שמה של טכנולוגיית גישת-הנתונים החדשה של מיקרוסופט. מי שלא מכיר, יכול לצפות ב webcasts שהקלטתי עליה בעבר ( 1 2 ). אם צריך לסכם את LINQ to SQL בשלושה מילים, ובהגדרה הכי כללית שאפשר, אלה יהיו קרוב לוודאי Data Access Layer. כלומר, שכבת העבודה עם נתונים של האפליקציה. מעל השכבה הזאת, צריכה לבוא שכבת הלוגיקה העסקית. לעיתים, באפליקציות שאין הרבה לוגיקה עסקית, עיקר הלוגיקה מהווה למעשה ה DAL. במצב כזה, עיקר הלוגיקה יהיה וואלידציה של הנתונים שנכנסים ויוצאים, ואולי תוספת מועטה של פונקציונאליות...
מצאתי היום את הזמן להקליט עוד פרק קצר בנושא LINQ to SQL. מדובר בעיקר בפרק שמשלים נושאים שנידונו בפרק הקודם . בין הנושאים שעליהם מדובר ב WebCast הזה מדובר על הוספת פעילויות מותאמות אישית מול הDB כחלק משכבת ה LINQ to SQL, הרצת משפטי SQL ישירות מול הDB, שימוש ב partial methods, התערבות במנגנון ההוספה/מחיקה/עדכון של נתונים לפני הביצוע עצמו. אתם מוזמנים לצפות ולהגיב. שחר.
הקלטתי WebCast בנושא LINQ to SQL, שיטת ניהול-שכבת נתונים החדשה של מיקרוסופט. אורך ה webcast הוא כחצי שעה, והמטרה שלו זה לכסות את הנושאים העיקריים בעבודה היום-יומית עם LINQ to SQL: DataContext LINQ Anonymous Types שליפת מידע הוספת מידע עדכון מידע מידע בצורת אובייקטים וגם, קצת מאחורי הקלעים של LINQ to SQL, מה נוצר ומה קורה מאחור. מדובר בחצי-שעה שהמטרה שלה להקנות את הבסיס לשימוש ב LINQ to SQL. להורדת ה WebCast לחץ כאן בהצלחה.