none
כתיבת תנאי בתוך Include RRS feed

  • שאלה

  • שלום.

    אני מעונין לבצע Include על dbSet רק אם מתקיים תנאי מסוים באבא, ולכן ניסיתי לכתוב כך:

    Person p= dbSet.Include(p=>p.path != string.Empty?null: p.Childrens)).SingleOrDefault();

    אני מקבל את השגיאה הבאה:

    The Include path expression must refer to a navigation 
    property defined on the type. 
    Use dotted paths for reference navigation properties and 
    the Select operator for collection navigation properties.
    
    Parameter name: path

    האם יש לי אפשרות לכתוב תנאי על ה-Include? אם כן , מה הדרך?

    תודה מראש!

    ג'רי

    

    ג'רי

    • הועבר על-ידי Ido Flatow. _Moderator יום רביעי 07 נובמבר 2012 20:20 (מאת:Web Development)
    יום ראשון 04 נובמבר 2012 09:31

תשובות

  • לא ניתן להזין פילטר בתוך Include. לשם כך תצטרך לבצע משפט linq עם סינון פנימי, לדוגמה:

    from e in entities

    select new entity {prop = e.prop1,

    collection = from c in e.collection1

    where c.prop == something

    select c}

    (מצטער על העימוד, קצת בעיה עם העברית)

    ראה דוגמה נוספת כאן:

    http://msmvps.com/blogs/matthieu/archive/2009/10/07/ef-include-with-where-clause.aspx


    Please mark posts as answers/helpful if it answers your question.
    Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
    Visit my blog: http://blogs.microsoft.co.il/blogs/idof

    • סומן כתשובה על-ידי ג'רי יום חמישי 08 נובמבר 2012 06:00
    יום רביעי 07 נובמבר 2012 20:24
    מנחה דיון

כל התגובות

  • תודה רבה!

    הלינקים ששלחת לי מסייעים לעבודה עם include ו-lambda expression , זה אני עושה באמצעות DbExtensions של  EF4.1

    אני מחפש אפשרות לבצע את ה-include רק אם מתקיים תנאי מסוים. במקרה הנ"ל: רק אם השדה path ריק אני רוצה שה-include

    יתבצע.

    יש אפשרות כזו?

    תודה מראש!

    
    

    ג'רי

    יום שני 05 נובמבר 2012 09:41
  • אם אני מבין אותך נכון אז התנאי שלך לא צריך להיות בתוך ה INCLUDE אלא בחוץ כחלק מה WHERE

    אם התנאי לא יתקיים אז הרשומות פשוט לא יגיעו ולכן לא יהיו בINCLUDE

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


    signature

    יום רביעי 07 נובמבר 2012 10:33
    מנחה דיון
  • תודה על התשובה!

    מה שאני רוצה בעצם, זה כעין leftJoin והתנאי יהיה על ה-join,

    כדי שאם התנאי לא יתקיים ב-join, אני אקבל את רשומת האב בכל מקרה.

    (בשונה מזה שאם אכתוב את התנאי ב-where שאז אם התנאי לא מתקיים, לא אקבל גם את האב)

    האם יש לי דרך לעשות זאת ב-Include?

    או שכדאי לבצע זאת באמצעות linq?

    

    ג'רי

    יום רביעי 07 נובמבר 2012 10:45
  • זו בדיוק אחת מהאפשרויות שכתבתי לך מעל

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

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


    signature

    יום רביעי 07 נובמבר 2012 14:33
    מנחה דיון
  • לא ניתן להזין פילטר בתוך Include. לשם כך תצטרך לבצע משפט linq עם סינון פנימי, לדוגמה:

    from e in entities

    select new entity {prop = e.prop1,

    collection = from c in e.collection1

    where c.prop == something

    select c}

    (מצטער על העימוד, קצת בעיה עם העברית)

    ראה דוגמה נוספת כאן:

    http://msmvps.com/blogs/matthieu/archive/2009/10/07/ef-include-with-where-clause.aspx


    Please mark posts as answers/helpful if it answers your question.
    Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
    Visit my blog: http://blogs.microsoft.co.il/blogs/idof

    • סומן כתשובה על-ידי ג'רי יום חמישי 08 נובמבר 2012 06:00
    יום רביעי 07 נובמבר 2012 20:24
    מנחה דיון
  • תודה!

    זו בדיוק היתה שאלתי, עזרת לי מאד!


    ג'רי

    יום חמישי 08 נובמבר 2012 06:02