عملگر پیوند Join
عملگر پیوند Join در زبان کوئری نویسی LINQ همانطور که از اسم آن نیز مشخص است به منظور پیوند دو مجموعه و تولید یک مجموعه جدید استفاده می شود. در جدول زیر می توانید عملگرهای پیوند را مشاهده کنید:
عملگر | توضیحات |
Join | عملگر Join دو مجموعه را بر اساس یک کلید به هم پیوند داده و به عنوان نتیجه باز می گرداند (مشابه inner join در SQL). |
GroupJoin | عملگر GroupJoin دو مجموعه را بر اساس یک کلید به هم پیوند داده و گروه هایی از مجموعه ها باز میگرداند (مشابه left outer join در SQL). |
عملگر Join
عملگر Join بر روی دو مجموعه کار می کند، مجموعه درونی (inner) و مجموعه بیرونی (outer) و به عنوان نتیجه یک مجموعه جدید که از عناصر مجموعه داخلی و خارجی تشکیل شده است را باز میگرداند. عملکرد این عملگر مشابه inner join در SQL است.
عملگر Join در سینتکس متد
متد افزودنی Join دو overload دارد که در زیر مشاهده می کنید:
1 2 3 4 5 6 7 8 9 10 | public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector); public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector, IEqualityComparer<TKey> comparer); |
همانطور که مشاهده می کنید اولی 5 ورودی دارد (به جز اولین ورودی که با this شروع می شود). به مثال زیر توجه کنید. در این مثال دو مجموعه از نوع رشته داریم و می خواهیم عناصری که در هر دو مجموعه یکسان هستند را انتخاب کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | IList<string> strList1 = new List<string>() { "One", "Two", "Three", "Four" }; IList<string> strList2 = new List<string>() { "One", "Two", "Five", "Six" }; var innerJoin = strList1.Join(strList2, str1 => str1, str2 => str2, (str1, str2) => str1); |
خروجی:
1 2 | One Two |
برای درک بهتر یک مثال دیگر را بررسی میکنیم. در مثال زیر دو کلاس با نام Student و Standard داریم که کلاس Student شامل یک فیلد به نام StandardID دارد.
1 2 3 4 5 6 7 8 9 | public class Student{ public int StudentID { get; set; } public string StudentName { get; set; } public int StandardID { get; set; } } public class Standard{ public int StandardID { get; set; } public string StandardName { get; set; } } |
نحوه استفاده از متد Join برای انتخاب دانش آموزان و استاندارد مربوطه به این شکل خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", StandardID =1 }, new Student() { StudentID = 2, StudentName = "Moin", StandardID =1 }, new Student() { StudentID = 3, StudentName = "Bill", StandardID =2 }, new Student() { StudentID = 4, StudentName = "Ram" , StandardID =2 }, new Student() { StudentID = 5, StudentName = "Ron" } }; IList<Standard> standardList = new List<Standard>() { new Standard(){ StandardID = 1, StandardName="Standard 1"}, new Standard(){ StandardID = 2, StandardName="Standard 2"}, new Standard(){ StandardID = 3, StandardName="Standard 3"} }; var innerJoin = studentList.Join(// outer sequence standardList, // inner sequence student => student.StandardID, // outerKeySelector standard => standard.StandardID, // innerKeySelector (student, standard) => new // result selector { StudentName = student.StudentName, StandardName = standard.StandardName }); |
در مثال فوق از آنجایی که کوئری با studentList آغاز می شود، پس آن را به عنوان مجموعه بیرونی در نظر می گیریم. اولین ورودی متد Join مجموعه درونی را مشخص می کند که در این مثال standardList است. ورودی دوم و سوم فیلدی را مشخص می کنند که باید در مجموعه بیرونی و درونی یکی باشد. در این مثال می گوییم که عناصری را انتخاب کن که مقدار فیلد StandardID آن ها یکی باشد. آخرین ورودی متد به منظور شکل دادن به مجموعه نهایی تولید شده استفاده می شود. در این مثال ما مجموعه از یک شیء که شامل خاصیت StudentName و StandardName است را انتخاب می کنیم. خروجی مثال فوق به شکل زیر خواهد بود:
1 2 3 4 | John - Standard 1 Moin - Standard 1 Bill - Standard 2 Ram - Standard 2 |
عملگر Join در سینتکس کوئری
نحوه استفاده از عملگر Join در سینتکس کوئری کمی با سینتکس متد فرق دارد. در سینتکس کوئری باید مجموعه بیرونی، انتخاب کننده کلید و انتخاب کننده نتیجه مشخص شوند. کلمه کلیدی ‘on’ برای مشخص کردن کلید ها استفاده می شود که در آن مقداری که قبل از equals قرار دارد، کلید بیرونی و مقداری که بعد equals قرار دارد، کلید درونی است. سینتکس کلی به شکل زیر است:
1 2 3 4 | from ... in outerSequence join ... in innerSequence on outerKey equals innerKey select ... |
برای درک بهتر به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", Age = 13, StandardID =1 }, new Student() { StudentID = 2, StudentName = "Moin", Age = 21, StandardID =1 }, new Student() { StudentID = 3, StudentName = "Bill", Age = 18, StandardID =2 }, new Student() { StudentID = 4, StudentName = "Ram" , Age = 20, StandardID =2 }, new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } }; IList<Standard> standardList = new List<Standard>() { new Standard(){ StandardID = 1, StandardName="Standard 1"}, new Standard(){ StandardID = 2, StandardName="Standard 2"}, new Standard(){ StandardID = 3, StandardName="Standard 3"} }; var innerJoin = from s in studentList // outer sequence join st in standardList //inner sequence on s.StandardID equals st.StandardID // key selector select new { // result selector StudentName = s.StudentName, StandardName = st.StandardName }; |
خروجی مثال فوق:
1 2 3 4 | John - Standard 1 Moin - Standard 1 Bill - Standard 2 Ram - Standard 2 |
هیچ نظری ثبت نشده است