ביצוע שאילתא בlinq
להלן הסברים מפורטים (מדי...) בתרגום חופשי:
מטרת השאילתא:
לשלוף מוצרי הצעת מחיר של הצעת מחיר מסוימת ואת קוד המוצר עבור כל
מוצר הצעת מחיר ולאכסנם באובייקט ייעודי(class) שיצרנו.
לצורך השליפה יצרנו List
של אובייקטים מסוג ImportProductTableDataItem
(שם
הclass)
ישויות מעורבות בשאילתא : מוצר(product) ומוצר הצעת מחיר (quotedetail).
From -מגדיר את הישות הראשית בשאילתא (from p in
orgContext.CreateQuery("product"))
–Join
מגדיר את הישות המצורפת(join qd in
orgContext.CreateQuery("quotedetail"))
On -מגדיר את הקשר בין הישויות (on p["productid"] equals qd["productid"])שדה קוד מוצר במוצר הזמנה == לקוד המוצר(מפתח ראשי)
Where-מגדיר תנאים ופילטורים
כלליים על השאילתא : שליפת מוצרי הצעת מחיר מסוימת לפי המפתח הראשי של הצעת המחיר(Guid)( qd.GetAttributeValue<Guid>("quoteid") == new Guid(m_entityId)
)
Select-מגדיר את השדות הנשלפים ואכסונם באובייקט.
הסרוויס שמשתמשים לצורך השאילתא הוא: OrganizationServiceContext
OrganizationServiceContext
orgContext = new
OrganizationServiceContext(_serviceProxy)
צורת השליפה הזו טובה גם לשליפת ישות אחת. (בלי join)
GetAttributeValue<Guid>("quoteid") –מיועד
לשליפת שדות והמרתם לtype מסוים
לא חייבים להמיר לאובייקט את הישויות הנשלפות.
הדיפולט שהquery מחזיר הוא IEnumerable של הישות הנשלפת וניתן להמירו
לליסט או למערך או לשלוף את האובייקט הראשון\אחרון בליסט (מיועד למקרים שבהם נשלפת
רשומה אחת בלבד) (FirstOrDefault())
וניתן גם לעבוד עםearly bound (ולמי שלא מכיר את המושג- יבואו הסברים בהמשך)
לדוגמה:
IEnumerable<SystemUser>
systemUsersInum = from systemUsers in orgContext.CreateQuery<SystemUser>()
where systemUsers.DomainName == CurrentUserName
select systemUsers;
if (systemUsersInum.Count() > 0)
{
CurrentUserId = systemUsersInum.FirstOrDefault().Id;
}