LINQ در Dot Net ویژگی برای Join کردن داده های دو منبع گوناگون را فراهم کرده است که از آنها می توانیم درونLinq-to-Entity در Entity Framework کمک بگیریم تا عملیات Join بر روی چندین کلاس موجودیت را انجام دهیم تا در پایان داده های Join شده از چندین جدول پایگاه داده را داشته باشیم. در این نوشته نمی خواهیم درباره Join در SQL گفتگو کنیم، از این رو می توانید پیوندهای زیر را بخوانید.

نمایش داده از چندین جدول – SQL Join – بخش نخست

نمایش داده از چندین جدول – SQL Join – بخش دوم

نمایش داده از چندین جدول – SQL Join – بخش سوم

در کد زیر گمان کنید که دو کلاس موجودیت به نام های Category و Product دارید که رابطه یک به چند را میان آنها شناسانده اید (تعریف کرده اید) به گونه ای که به ازای هر دسته بندی، چندین کالا است ولی هر کالا درون یک دسته بندی هست. متغیر categories سطرهایی از جدول categorie و متغیر products سطرهایی از جدول products را در خود دارند که پیش از این واکشی شده اند.

Inner Join در LINQ

در LINQ برای Join کردن دو یا چند منبع باید عبارت from … join … on را به کار ببریم. می خواهیم Innerr Join را انجام دهیم که بر اساس برابری مقدارهای دو ستون از دو جدول انجام می شود. در کد بالا، برابری بر روی دو ستون (یا بهتر است بگوییم بر روی نام دو ویژگی از کلاس های موجودیت) به نام ID از کلاس Category و CategoryId از کلاس Product انجام می شود. توجه کنید که ویژگی CategoryId از کلاس Product، کلید خارجی به کلاس Category است. در پایان چون پیش روی عبارت select عبارت mew آمده است، پس می خواهیم تنها شماری از ستون ها از دو جدول را در خروجی داشته باشیم.

در کد های زیر دو کلاس به نام Student و Adress را نوشته ایم که میان آنها یک ویژگی مشترک به نام AddressId هست . در کد زیر می خواهیم فهرست همه دانش آموز هایی را پیدا کنیم که مقدار ویزگی AddressId آنها با مقدار ویژگی Id در کلاس Address یکسان (برابر یا Equal) باشد.

در کد زیر که درون متد Main نوشته شده است، نخست نمونه هایی از هر دو کلاس ساخته ایم و سپس با ویژگی های LINQ دو جدول را با یکدیگر Join کرده ایم. کد زیر تنها بخش Join بدست Linq را نشان می دهد. همانگونه که می بینید Inner Join بر روی برابر بودن مقدار دو ویژگی  AddressId از کلاس Student و Id از کلاس Address انجام شده است. بررسی برابر بودن بدست عبارت equals انجام می شود.

در کد بالا نتیجه برگشتی عبارت Linq را به کمک متد ()ToList به یک لیست تبدیل کرده ایم. گمان می کنید که تعداد سطرهای برگشتی عبارت Linq چه شماری (تعدادی) است؟ همانگونه که می بینید ۵ نمونه از هر کلاس ساخته ایم، بنابراین خروجی Join بر روی برابری ویزگی ها، باید همین پنج سطر باشد ولی چهار سطر برگشت داده می شود، زیرا مقدر ویژگی AddresId در سومین نمونه از کلاس Student برابر با صفر است و این مقدار با هیچ کدام از مقدارهای ویژگی Id در کلاس Adress یکسان نیست، پس در نتیجه برگشنی نخواهد بود.کد زیر، همه کد درون متد Main را نشان می دهد.

شکل زیر یک مدل ساده میان دو کلاس به نام های RobotFactory و RobotDog را نشان می دهد که یک رابطه یک به چند میان آنها است به این مفهوم که به ازای هر سطر از RobotFactory چندین سطر از RobotDog هست. بنابراین ویژگی RobotFactoryId در کلاس موجودیت RobotDog، کلید خارجی به جدول RobotFactory است.

مثال – فهرست تمامی کارخانه ها و مدل های ساخته شده آنها را بدست آورید، به گونه ای که نام شهر (Location) کارخانه تگزاس باشد. همانگونه که می بینید نخست بدست عبارت using یک نمونه از کلاس Context ساخته ایم و سپس بدست این نمونه، به نام ویژگی های <DbSet<RobotDog و <DbSet<RobotFactorie دسترسی خواهیم داشت. فرض کنید که از پیش داده ها درون جدول ها بدست متد ()Add یا ()AddRange درج شده اند.

شکل زیر توسعه یافته شکل بالا است که در آن یک جدول به نام DogOwner افزوده شده است. میان جدول RobotDog و OwnerDog رابطه یک به یک است به گونه ای که ویژگی (ستون) DogOwnerId در جدول RobotDog کلید خارجی به جدول DogOwner و همین گونه ویژگی (ستون) RobotDogId در جدول DogOwner کلید خارجی به جدول RobotDog است. کد زیر دو بار عبارت Join را به کار برده زیرا می خواهیم سه جدول را با یکدیگر Join کنیم.

دانلود سورس این نوشته Ef Join