Linq בזמן ריצה (Runtime)

| More
נוסף ב-25/12/2007 02:47 על ידי דניאל כץ

במאמר זה נסקור את המתודולוגיה החדשה הנקראת Linq to Sql ונענה על השאלות: איך Linq ממומש ברמת הCLR? מהם המרכיבים המרכזיים בטכנולוגיה? ואיך ניתן לממש תשאול דינאמי בזמן ריצה (Runtime)? כל זה מלווה בדוגמאות קוד עם הסברים.

מה זה Linq?

מתודולוגיית Linq נוספה לNet. בגרסתה ה3.5, ומהווה מקבץ ביטויים לתשאול טיפוסים דמויי מערכים, או בעברית פשוטה – Linq יכול לתשאל כל טיפוס שמממש את הממשק IEnumerable. בנוסף חשוב לציין שעיקר התועלת במתודולוגיית Linq היא צורת הביטויים (Syntax) שמאפשרת לנו פשוט לציין מה אנחנו רוצים לעשות במקום להתמקד בדרך להגיע אל התוצאה הרצויה, נביא דוגמה:

Dim arr As IEnumerable(Of Integer) = New Integer() {0, 1, 2, 3, 4, 99}

Function WithoutLinq() As IEnumerable(Of Integer)

    Dim out = New List(Of Integer)

    For Each itm In arr

        If itm > 2 And itm < 10 Then

            out.Add(itm)

        End If

    Next

    Return out

End Function

Function UsingLinq() As IEnumerable(Of Integer)

    Return (From p In arr Where p > 2 And p < 10)

End Function

בדוגמה שני פונקציות שמחזירות את כל המספרים שגדולים מ2 וקטנים מ10 מתוך המערך arr שמוכרז בתחילת הדוגמה. ההבדל היחיד ביניהם הוא בצורת הכתיבה. בפונקציה WithoutLinq אנו מבצעים את הסינון ללא שימוש בLinq ולכן נאלצים לכתוב הרבה קוד שלא מעניין אותנו בכלל, כמו לולאת For Each או לולאת מונה וכדומה. להבדיל, בפונקציה UsingLinq, אני מקבל את אותה התוצאה ע"י שאני פשוט כותב "תוציא את כל האיברים שמתקיים בהם התנאי X" וLinq דואג לכל השאר.

בנוסף, Linq מהווה יסוד למספר טכנולוגיות נוספות כגון Linq to Sql. עוד...

Tags: , ,

.NET 3.5

קינון SqlTransaction

| More
נוסף ב-20/08/2007 08:52 על ידי דניאל כץ

הבעיה שבה נתקלתי היא, למצוא דרך נוחה להשתמש באותה הפונקציה (בדוגמה שלנו זה ‏BasicPattern‏) בתוך ומחוץ ל‏SqlTransaction‏ בלי לשכתב אותה פעמיים.‏

מאילוצי המבנה של ספריות ה‎.NET‎‏ יש צורך לכתוב כל אחת מהפונקציות האלה (ובמקרים רבים יש הרבה כאלה) פעמיים: פעם אחת תוך פתיחת חיבור חדש למסד הנתונים, ופעם שנייה תוך שימוש בחיבור שכבר נפתח עבור הטרנסקציה ע"י הפונקציה הקודמת (בדוגמה שלנו זה ‏SimpleTransactionPattern‏).

הפתרון שלי בא בצורת מחלקה חדשה שהענקתי לה את השם ‏DbConnection‏. במחלקה קיימים שני ‏Constructorים:

  1. New(ByVal enforceTransaction As Boolean)‎
  2. New(ByVal connection As DbConnection, ByVal enforceTransaction As Boolean)

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

Tags: ,

.NET