Web Devs
641 subscribers
218 photos
22 videos
17 files
233 links
Articles, News, Jokes, Quotes, Back-End and UI/UX for web developers.
Github : https://github.com/fullStackDevsGroup
Advertising: @adsfullStackDevs
Download Telegram
#LinqToSql

در این پست می خواهیم به این سوال ها پاسخ دهیم که :

🔹 انواع join در LINQ چیست و چگونه انواع مختلف join را در LinqToSql انجام دهیم

▪️Cross Join
🔸نام دیگر آن Cartesian Product یا ضرب دکارتی میباشد.
در Cross Join هر یک از آیتم ها در DataSource یا Collection اول با تک تک آیتم های DataSource یا Collection دوم با هم مپ میشوند.
مثال
a = {"C#","Java" }
b ={1,2}
=>
result = { {"C#",1} , {"C#",2} , {"Java",1},{"Java",2} }

❗️اندازه خروجی (result) برابر با ضرب دکارتی دو ارایه خواهد بود.
یک مثال با LinqToSql :
var result = context.Products.SelectMany(p => context.Categories, (p, c) => new { p.Name, c.Title }).ToList();

❗️ توجه داشته باشید که در Cross Join دو DataSource یا Collection لزوما نیاز به داشتن ارتباط با همدیگر برای فیلتر کردن Data ندارند.

▪️Group Join
🔸این متد برای تولید ساختار های سلسله مراتبی استفاده میشود. بدین صورت که براساس یک کلید هر یک از ایتم های Collection سمت چپ با مجموعه ای از ایتم های مرتبط در Collection سمت راست تشکیل یک زوج را میدهند.یعنی یک ایتم از Collection سمت چپ لیستی از آیتم های Collection سمت راست خواهد داشت.
❗️ اگر یک آیتم در Collection سمت چپ با هیچ یک از آیتم های Collection سمت راست براساس کلید تعیین شده وجه اشتراک نداشته باشند باز هم در نتیجه نهایی کوئری وجود خواهد داشت.
کاربرد اصلی آن برای رابطه های یک به چند میباشد .

var result = context.Orders.
GroupJoin(context.OrderDetails, o => o.ID, od => od.OrderId,
(o, od) => new
{
o,
od
}).ToList();

▪️Inner Join
🔸رایج ترین نوع جوین inner join میباشد از این نوع Join برای ادغام دو جدول به یک جدول براساس یک یا چند مشخصه (کلید) مشترک استفاده میشود.
❗️در این نوع join اگر یک آیتم از Collection سمت چپ با هیچ یک از آیتم های Collection سمت راست براساس کلید تعیین شده وجه اشتراکی نداشته باشد ، آن آیتم در نتیجه تولید شده نهایی کوئری وجود نخواهد داشت
در واقع این نوع Join فقط و فقط وجه اشتراک دو Collection را بر اساس کلید تعیین شده در خروجی نمایش خواهد داد.

var result = context.Orders.Join(context.OrderDetails, o => o.ID, od => od.OrderId,
(o, od) => new
{
o,
od
}).ToList();

✳️تفاوت Group Join
و Inner Join چیست ⁉️

🔸همانطور که در توضیحات هرکدام گفتیم در Group Join اگر به ازای یک آیتم در Collection سمت چپ، آیتم متناظری در Collection سمت راست، براساس کلید مشترک تعیین شده وجود نداشته باشد آن آیتم باز هم در نتیجه تولید شده نهایی کوئری حضور خواهد داشت.
این در حالی است که در Inner Join چنین اتفاقی نمی افتد و فقط ایتم های مشترک انتخاب خواهند شد.

▪️Left Join
🔸 نام دیگر آن Left Outer Join میباشد. این نوع Join بروی دو Collection که بایستی کلید مشترکی با یکدیگر داشته باشند انجام میشود و در left Join تمام آیتم های موجود
در Collection سمت چپ بعلاوه آنهایی که وجه اشتراکی با Collection سمت راست دارند بر اساس کلید تعیین شده در نتیجه نهایی کوئری ظاهر میشوند.

var result = context.Orders.

GroupJoin(context.OrderDetails, order => order.ID, orderDetail => orderDetail.OrderId, (x, y) => new { Order = x, OrderDetail = y })

.SelectMany(c => c.OrderDetail.
DefaultIfEmpty(),
(x, y) => new
{
Order = x.Order,
OrderDetail = y
}).ToList();

🔹 متد
DefaultIfEmpty() در مثال بالا تعیین کننده این است که :
🔸اگر OrderDetail شامل مقداری نبود، در نتیجه تولید شده مقدار Default را برای آن تولید کن. این امر برای جلوگیری از صادر شدن استثنا Null صورت میگیرد و علت وقوع آن زمانی است که
به ازای یک آیتم در Collection سمت چپ دارای هیچ آیتمی بر اساس کلید تعیین شده
در Collection سمت راست، نباشد.

▪️Right Join
🔸این نوع جوین برعکس Left Join میباشد و نام دیگر آن Right Outer Join میباشد. برای نوشتن کوئری آن نیز فقط باید در کوئری بالا جای Collection های سمت چپ و راست را عوض کنید.
اما از نطر تعریف در Right Join تمام آیتم های موجود در Collection سمت راست بعلاوه آن ایتم هایی که براساس کلید تعیین شده داری وجه اشتراکی با آیتم های Collection سمت چپ دارند در نتیجه نهایی ظاهر خواهد شد.

@FullStackDevs
#ادامه
#LinqToSql

▪️Full Join
🔸نام دیگر این نوع جوین Full Oter Join میباشد و باید بدانید که Linq به صورت مستقیم آنرا پشتیبانی نمیکند .در Full Join تمامیه آیتم های Collection سمت چپ بعلاوه تمامی آیتم های Collection سمت راست بعلاوه تمامی آیتم های مشترک دو Collection در نتیجه نهایی کوئری تولید خواهند شد.برای انجام Full Join در بین دو Collection باید از دو Collection یکبار Left join گرفته و
بار دیگر از آنها Right Join بگیرید و در نهایت نتیجه دو Join انجام شده را
باهم Union نمایید.

var left = context.Orders.

GroupJoin(context.OrderDetails, order =>
order.ID, orderDetail => orderDetail.OrderId, (x, y) => new { Order = x, OrderDetail = y })

.SelectMany(c => c.OrderDetail.DefaultIfEmpty(),
(x, y) => new Dto
{
Order = x.Order,
OrderDetail = y
}).ToList();

var right = context.OrderDetails.

GroupJoin(context.Orders, orderDetail => orderDetail.OrderId, order =>
order.ID, (x, y) => new { OrderDetail = x, Order = y })

.SelectMany(c => c.Order.DefaultIfEmpty(),
(x, y) => new Dto
{
OrderDetail = x.OrderDetail,
Order = y
}).ToList();

var fullJoin = left.Union(right);

✳️سوالی
که اکنون ممکن است برای شما پیش آید این است که تفاوت بین Full Join و Union در LINQ چیست ⁉️
🔸در Union نتیجه دو کوئری را به صورت یک نتیجه واحد با هم ترکیب میکنیم که شامل تمام آیتم های دو کوئری میباشد و قوانین آن این است که :
تعداد و ترتیب ستونها باید در دو کوئری یکسان باشد.
انواع داده ها باید سازگار باشند.
🔸در Full Join نتیجه left Join و Right Join با هم ترکیب شده و تمام آیتم های دارای وجه اشتراک وحتی آنهایی که با هم وجه اشتراکی براساس کلید تعیین شده ندارند در نتیجه نهایی کوئری نمایش داده میشوند.
درواقع هدف از full Join واکشی تمام آیتم های دو Collection به همراه روابط و نقاط متناظر آنها براساس کلید تعیین شده میباشد در حالی که Union در صورت برقرار بودن شروط لازم صرفا فقط نتیجه دو کوئری را بدون در نظر گرفتن رابطه بین آیتم های آنها با هم ترکیب میکند.
@FullStackDevs
Forwarded from Web Devs
#LinqToSql

در این پست می خواهیم به این سوال ها پاسخ دهیم که :

🔹 انواع join در LINQ چیست و چگونه انواع مختلف join را در LinqToSql انجام دهیم

▪️Cross Join
🔸نام دیگر آن Cartesian Product یا ضرب دکارتی میباشد.
در Cross Join هر یک از آیتم ها در DataSource یا Collection اول با تک تک آیتم های DataSource یا Collection دوم با هم مپ میشوند.
مثال
a = {"C#","Java" }
b ={1,2}
=>
result = { {"C#",1} , {"C#",2} , {"Java",1},{"Java",2} }

❗️اندازه خروجی (result) برابر با ضرب دکارتی دو ارایه خواهد بود.
یک مثال با LinqToSql :
var result = context.Products.SelectMany(p => context.Categories, (p, c) => new { p.Name, c.Title }).ToList();

❗️ توجه داشته باشید که در Cross Join دو DataSource یا Collection لزوما نیاز به داشتن ارتباط با همدیگر برای فیلتر کردن Data ندارند.

▪️Group Join
🔸این متد برای تولید ساختار های سلسله مراتبی استفاده میشود. بدین صورت که براساس یک کلید هر یک از ایتم های Collection سمت چپ با مجموعه ای از ایتم های مرتبط در Collection سمت راست تشکیل یک زوج را میدهند.یعنی یک ایتم از Collection سمت چپ لیستی از آیتم های Collection سمت راست خواهد داشت.
❗️ اگر یک آیتم در Collection سمت چپ با هیچ یک از آیتم های Collection سمت راست براساس کلید تعیین شده وجه اشتراک نداشته باشند باز هم در نتیجه نهایی کوئری وجود خواهد داشت.
کاربرد اصلی آن برای رابطه های یک به چند میباشد .

var result = context.Orders.
GroupJoin(context.OrderDetails, o => o.ID, od => od.OrderId,
(o, od) => new
{
o,
od
}).ToList();

▪️Inner Join
🔸رایج ترین نوع جوین inner join میباشد از این نوع Join برای ادغام دو جدول به یک جدول براساس یک یا چند مشخصه (کلید) مشترک استفاده میشود.
❗️در این نوع join اگر یک آیتم از Collection سمت چپ با هیچ یک از آیتم های Collection سمت راست براساس کلید تعیین شده وجه اشتراکی نداشته باشد ، آن آیتم در نتیجه تولید شده نهایی کوئری وجود نخواهد داشت
در واقع این نوع Join فقط و فقط وجه اشتراک دو Collection را بر اساس کلید تعیین شده در خروجی نمایش خواهد داد.

var result = context.Orders.Join(context.OrderDetails, o => o.ID, od => od.OrderId,
(o, od) => new
{
o,
od
}).ToList();

✳️تفاوت Group Join
و Inner Join چیست ⁉️

🔸همانطور که در توضیحات هرکدام گفتیم در Group Join اگر به ازای یک آیتم در Collection سمت چپ، آیتم متناظری در Collection سمت راست، براساس کلید مشترک تعیین شده وجود نداشته باشد آن آیتم باز هم در نتیجه تولید شده نهایی کوئری حضور خواهد داشت.
این در حالی است که در Inner Join چنین اتفاقی نمی افتد و فقط ایتم های مشترک انتخاب خواهند شد.

▪️Left Join
🔸 نام دیگر آن Left Outer Join میباشد. این نوع Join بروی دو Collection که بایستی کلید مشترکی با یکدیگر داشته باشند انجام میشود و در left Join تمام آیتم های موجود
در Collection سمت چپ بعلاوه آنهایی که وجه اشتراکی با Collection سمت راست دارند بر اساس کلید تعیین شده در نتیجه نهایی کوئری ظاهر میشوند.

var result = context.Orders.

GroupJoin(context.OrderDetails, order => order.ID, orderDetail => orderDetail.OrderId, (x, y) => new { Order = x, OrderDetail = y })

.SelectMany(c => c.OrderDetail.
DefaultIfEmpty(),
(x, y) => new
{
Order = x.Order,
OrderDetail = y
}).ToList();

🔹 متد
DefaultIfEmpty() در مثال بالا تعیین کننده این است که :
🔸اگر OrderDetail شامل مقداری نبود، در نتیجه تولید شده مقدار Default را برای آن تولید کن. این امر برای جلوگیری از صادر شدن استثنا Null صورت میگیرد و علت وقوع آن زمانی است که
به ازای یک آیتم در Collection سمت چپ دارای هیچ آیتمی بر اساس کلید تعیین شده
در Collection سمت راست، نباشد.

▪️Right Join
🔸این نوع جوین برعکس Left Join میباشد و نام دیگر آن Right Outer Join میباشد. برای نوشتن کوئری آن نیز فقط باید در کوئری بالا جای Collection های سمت چپ و راست را عوض کنید.
اما از نطر تعریف در Right Join تمام آیتم های موجود در Collection سمت راست بعلاوه آن ایتم هایی که براساس کلید تعیین شده داری وجه اشتراکی با آیتم های Collection سمت چپ دارند در نتیجه نهایی ظاهر خواهد شد.

@FullStackDevs
Forwarded from Web Devs
#ادامه
#LinqToSql

▪️Full Join
🔸نام دیگر این نوع جوین Full Oter Join میباشد و باید بدانید که Linq به صورت مستقیم آنرا پشتیبانی نمیکند .در Full Join تمامیه آیتم های Collection سمت چپ بعلاوه تمامی آیتم های Collection سمت راست بعلاوه تمامی آیتم های مشترک دو Collection در نتیجه نهایی کوئری تولید خواهند شد.برای انجام Full Join در بین دو Collection باید از دو Collection یکبار Left join گرفته و
بار دیگر از آنها Right Join بگیرید و در نهایت نتیجه دو Join انجام شده را
باهم Union نمایید.

var left = context.Orders.

GroupJoin(context.OrderDetails, order =>
order.ID, orderDetail => orderDetail.OrderId, (x, y) => new { Order = x, OrderDetail = y })

.SelectMany(c => c.OrderDetail.DefaultIfEmpty(),
(x, y) => new Dto
{
Order = x.Order,
OrderDetail = y
}).ToList();

var right = context.OrderDetails.

GroupJoin(context.Orders, orderDetail => orderDetail.OrderId, order =>
order.ID, (x, y) => new { OrderDetail = x, Order = y })

.SelectMany(c => c.Order.DefaultIfEmpty(),
(x, y) => new Dto
{
OrderDetail = x.OrderDetail,
Order = y
}).ToList();

var fullJoin = left.Union(right);

✳️سوالی
که اکنون ممکن است برای شما پیش آید این است که تفاوت بین Full Join و Union در LINQ چیست ⁉️
🔸در Union نتیجه دو کوئری را به صورت یک نتیجه واحد با هم ترکیب میکنیم که شامل تمام آیتم های دو کوئری میباشد و قوانین آن این است که :
تعداد و ترتیب ستونها باید در دو کوئری یکسان باشد.
انواع داده ها باید سازگار باشند.
🔸در Full Join نتیجه left Join و Right Join با هم ترکیب شده و تمام آیتم های دارای وجه اشتراک وحتی آنهایی که با هم وجه اشتراکی براساس کلید تعیین شده ندارند در نتیجه نهایی کوئری نمایش داده میشوند.
درواقع هدف از full Join واکشی تمام آیتم های دو Collection به همراه روابط و نقاط متناظر آنها براساس کلید تعیین شده میباشد در حالی که Union در صورت برقرار بودن شروط لازم صرفا فقط نتیجه دو کوئری را بدون در نظر گرفتن رابطه بین آیتم های آنها با هم ترکیب میکند.
@FullStackDevs