הפעלת Linq Queries על פקדים המכילים Collections ללא חשיפה של IEnumerable מתאים

25 בנובמבר 2011

2 תגובות


 


אחד מהיכולות החזקות של השפה שאנחנו משתמשים בהם רבות זהו היכולת להפעיל Linq to Objects על כל מי שמממש את:
IEnumerable<T>
 

 

ב – windows forms ישנם הרבה פקדים המכילים collections – כמו TabControl, TreeView ועוד.

 

הבעייה עם כל הפקדים הללו שהם חושפים את IEnumerable הרגיל, (ללא T) מה שגורם לכך שאי אפשר להפעיל עליהם שאילתות לינק.

 

 

כדי לתקן זאת ניתן להוסיף Extension Method מתאים לכל פקד ולהמיר את ה – IEnumerable  לאחד שתומך ב – Generic, לדוגמא:

 



internal static class Extension


{


    internal static IEnumerable<TabPage> AsEnumerator(this TabControl.TabPageCollection collection)


    {


        foreach (TabPage item in collection)


        {


            yield return item;


        }


    }


 


    internal static IEnumerable<TreeNode> AsEnumerator(this TreeNodeCollection collection)


    {


        foreach (TreeNode item in collection)


        {


            yield return item;


        }


    }


}


 


 

בשביל הדוגמא – נניח שיש לי TreeView המכיל שמות של טבלאות וכל טבלה מכילה את שמות העמודות (כמו ב – Sql Server Managment Studio)

כעת אני מעוניין לייצר סקריפט עבור שאילתת select – נוכל לכתוב את הקוד הבא:

 

 



string.Format("SELECT {0} FROM {1}",


    treeView1.SelectedNode.Nodes.AsEnumerator()


            .Select(x => "[" + x.Text + "]")


            .Aggregate((x, y) => x + ", " + y),


    treeView1.SelectedNode.Text);


 

התוצאה של הקוד הקודם תהיה:

 



SELECT [Account_Id], [Loyalty_Id] FROM AccountLoyalties


 


 

 

ברגע שנוסיף את  ה – Extension Method הללו עבור הפקדים השונים, נשדרג אותם ונוכל להפעיל עליהם שאילתות Linq

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

2 תגובות

  1. יעקב גולד22 בדצמבר 2011 ב 8:46

    מדוט נט 3.6 כבר יש פונקצייה מובנית בשביל מה שכתוב בכתבה
    אפשר לעשות משהוא כזה
    enum.Cast().Where…

    אפשר לראות את זה כאן
    http://msdn.microsoft.com/en-us/library/bb341406.aspx הגב

  2. זאב ספיץ10 בינואר 2012 ב 9:28

    וזה בדיוק ההמלצה של מיקרוסופט במצבים כאלה:

    http://msdn.microsoft.com/en-us/library/C318B79A-FA4D-4DE3-B62D-C1162BEB267E(d=lightweight,v=VS.100).aspx

    הגב