none
עזרה בשאילתת linq RRS feed

  • שאלה

  • אני מנסה לכתב שאילתת linq גלובאלית

    הכוונה שתהיה פונקציה שתקבל אובייקט ותחזיר את הנתונים של השאילתא.

    האובייקט יכליל את שם הטבלה שמות השדות ובמידה וישנם איזה שהם תנאים.

    אני פחות או יותר לא מוצא את הרגליים והידיים אשמח לעזרה והכוונה

    יאיר 

     

    • הועבר על-ידי Hengzhe Li יום רביעי 18 ינואר 2012 07:25 (מאת:Microsoft Visual C#)
    יום חמישי 27 אוקטובר 2011 10:26

תשובות

  • שאלה קצת ישנה שנשכחה מאחור :-)
    התשובה היא מאוד פשוטה קודם כל

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

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

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

    2. השימוש ב ORM מבחינת המפתח נעשה בדרך כלל בצורה קשיחה ז"א לפני תהליך הקמפול (אני דיי בטוח שכך זה אצלך לפי השאלה כי אחרת היית אמור לשלוט ברפלקציה בכל מקרה ובעבודה דינאמית של טעינת DLL חדשים וחקירה שלהם). מה שזה אומר שבזמן שכתבת את התוכנית כבר ידעת את שמות הטבלאות. אם כך הדבר ובכל מקרה בזמן שינוי שמות הטבלאות אתה אמור לגעת בקוד אז הרי שאין סיבה לעבודה בצורה דינאמית על מה שכבר ידוע לך. כמובן שעדיף לעבוד בצורה כזו שלא תאלץ את המפתח לגעת בקוד בכמה נקודות כשיש שינוי במבנה ה DDL אבל זה כבר עניין של אופן כתיבת הקוד והקפדה על reuse


    signature
    • הוצע כתשובה על-ידי pituachMVP, Moderator יום רביעי 23 נובמבר 2011 06:03
    • סומן כתשובה על-ידי Arik Poznanski יום שלישי 29 נובמבר 2011 12:37
    יום שלישי 01 נובמבר 2011 08:35
    מנחה דיון

כל התגובות

  • מצאתי אולי איזה כיוון באינטרנט קצת קשה לי להבין 

    אשמח אם משהו יוכל להסביר לי את כוונת המשורר ואם זה יכול להיות משהו יעזור לי

    תודה יאיר

     

    IQueryable<T> getQuery<T>(  T                         myTableEntity
                              , string[]                  arrayOfQueryTerms
                              , Expression<Func<T, bool>> predicate)
     { var fieldOrProperty = getMemberInfo(predicate);
       /* ... */
     }

    MemberInfo getmemberInfo<T>(Expression<Func<T,bool> expr)
     { var memberExpr = expr as MemberExpression;
       if (memberExpr != null) return memberExpr.Member;
       throw new ArgumentException();
     }

    var q = getQuery<FooTable>(foo, new[]{"Bar","Baz"}, x=>x.FieldName);

     

    יום חמישי 27 אוקטובר 2011 14:54
  • אם אני מבין את הבעייה שלי

    הבעייה היא בעצם לקבל את שם הטבלה במשתנה או דרך אובייקט.

    בעוד ששם הטבלה לפי מה שראיתי ב class של ה linq

    הוא מאפיין.

    השאלה היא האם אני יכול לעשות את זה בכלל ?

    ואם כן איך אפשר לעשות את זה ?

    יום שישי 28 אוקטובר 2011 09:50
  • שאלה קצת ישנה שנשכחה מאחור :-)
    התשובה היא מאוד פשוטה קודם כל

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

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

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

    2. השימוש ב ORM מבחינת המפתח נעשה בדרך כלל בצורה קשיחה ז"א לפני תהליך הקמפול (אני דיי בטוח שכך זה אצלך לפי השאלה כי אחרת היית אמור לשלוט ברפלקציה בכל מקרה ובעבודה דינאמית של טעינת DLL חדשים וחקירה שלהם). מה שזה אומר שבזמן שכתבת את התוכנית כבר ידעת את שמות הטבלאות. אם כך הדבר ובכל מקרה בזמן שינוי שמות הטבלאות אתה אמור לגעת בקוד אז הרי שאין סיבה לעבודה בצורה דינאמית על מה שכבר ידוע לך. כמובן שעדיף לעבוד בצורה כזו שלא תאלץ את המפתח לגעת בקוד בכמה נקודות כשיש שינוי במבנה ה DDL אבל זה כבר עניין של אופן כתיבת הקוד והקפדה על reuse


    signature
    • הוצע כתשובה על-ידי pituachMVP, Moderator יום רביעי 23 נובמבר 2011 06:03
    • סומן כתשובה על-ידי Arik Poznanski יום שלישי 29 נובמבר 2011 12:37
    יום שלישי 01 נובמבר 2011 08:35
    מנחה דיון
  • מטרת הקוד שיש כאן היה במקור ככל הנראה פשוט לקבל את השאילתה אותה מייצר ה ORM. זו אינה הדרך המומלצת מכמה סיבות שהעיקרית בהם היא שעצם הפעלת הקוד הזה גוררת הפעלת השאילתה. שאילתות העושות שמוש ב IQueryable עושות שימוש במה שנקרא "הרצה עצלה" (תרגום שלי...) הכוונה שהשאילתה בפועל אינה רצה כשאתה מגדיר את ה LINQ. הדבר הזה הוא המקור להצלחה של עבודה עם סינונים כמו למשל שמוש ב take(x). השאילתה שנבנית מאחורי הקלעים ניבנית רק בזמן שצריך לבצע שימוש בנתונים ולא לפני כן ולכן אם כתבת קוד שמחזיר נתונים מסויימים ואז הוספת סינון השאילתה שתועבר למסד הנתונים תהיה אחת ותכלול את הסינון ולא קודם תועבר שאילתה שתחזיר את כל הנתונים ורק אז יבוצע עליהם סינון ברמת האפליקציה.

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

    ** בלי קשר זה קוד נחמד ושימושי לדברים אחרים


    signature
    יום שלישי 01 נובמבר 2011 08:41
    מנחה דיון