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
با توجه کد تصویر کدام یک از گزینه ها زیر به عنوان implicit coercion ( تبدیل اجباری ) در نظر گرفته میشود ؟
Anonymous Quiz
39%
greeting + year.toString()
21%
greeting + String(year)
39%
greeting + year
#QUIZ

#CSharp The conditional logical operators can be overloaded ⁉️ 📢 @FullStackDevs
Anonymous Quiz
62%
true
38%
false
🔹نظر سنجی بدون پاسخ صحیح

به نظر شما برنامه نویس هنرمند است و برنامه نویسی هنر⁉️
Anonymous Quiz
27%
اره یک کار هنریه و من یک هنرمندم
67%
نه، یک کار منطقی و خلاقانست
6%
..
#JS

َArray method cheatsheet !

@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
#GraphQL
#ApiDesign


✳️ GraphQL

🔹 در این پست قراره با هم دیگه یک نگاهی به graphQl بندازیم و بدونیم که graphQl چی هست و چه کاربردی داره ؟

با یه جست و جوی ساده به این تعریف از graphQl میرسیم
🧩 GraphQL is a query language for APIs

▪️'گراف کیو ال یک زبان پرس و جو برای API هاست.

🔻 باید بدانید که GraphQL و REST هر دو API Design هستند .
یعنی رابطی کارآمد که به استفاده کنندگان API این امکان رو میده، علاوه بر استفاده از API امکان تعامل بهتری رو با اون داشته باشند.

مطمئنا با این تعاریف باز هم متوجه شدن اینکه graphQl چی هست، سخت و گیج کنندست. بیاین ساده تر به موضوع نگاه کنیم

🔸مهمترین تفاوت بین REST و GraphQl در جمع آوری داده هاست 🤔.

🔰 در یک اپلییکیشن واقعی همیشه با dataSet های بزرگ سر و کار داریم.
به عنوان مثل ' کاربری که مجموعه ای از پست ها رو داره ، پستی که مجموعه ای از کامنت ها و لایک ها رو داره '. برای دریافت این اطلاعات به کمک یک REST API چاره نیست، جز اینکه چندین بار به سرور درخواست بفرستیم و هر بار اطلاعاتی رو دریافت کنیم.
به عنوان مثال در یک درخواست اطلاعات کاربر رو دریافت کنیم و در درخواست بعدی اطلاعات مربوط به پست های کاربر و در درخواست بعدی اطلاعات مربوط به لایک های پست و ...

🔹به طور کل مزیت یک REST API در ساده نگه داشتن کارهاست. چون همیشه با یک API سرو کار داریم که فقط یک کار انجام میده. همین امر باعث میشه تا نگه داری و فهمیدنش رو ساده تر کنه.
علاوه بر اینها مشکلی که در دریافت داده ها از یک REST API وجود داره اینکه، نمیتوانیم بسته به نیازی که داریم داده های دریافتی رو مشخص کنیم و فقط اون دیتایی که لازم داریم رو از Endpoint دریافت کنیم. همیشه با یک Set کامل از داده سر و کار داریم. به عنوان مثال در یک صفحه فقط میخواهیم که نام کاربر را نمایش بدیم، وقتی که یک درخواست مبتنی بر دریافت اطلاعات کاربر به REST API میفرستیم،
در ریسپانس هم آدرس کاربر ، شماره تماس و ... سایر اطلاعات دیگر هم دریافت میشه در حالی که فقط به نام کابر برای نمایش نیاز داشتیم.
🔻این مشکل اصطلاحا over fetching گفته میشه.

❇️ بلاخره نوبت به graphQL رسید. grapthQL علاوه بر تمام تعاریفی که پیش از این گفتیم، یک سینتکس (syntax) برای چگونگی درخواست اطلاعات میباشد. و از آن برای دریافت اطلاعات از سرور به کلاینت استفاده میشه.

🔹 سه ویژگی اصلی graphQl :
🔻به کلاینت این اجازه رو میده تا فقط داده ای که نیاز داره رو مشخص کنه و فقط همون رو برای کلاینت باز میگردونه.
🔻جمع آوری داده هارو از dataSet ها و resource های مختلف بسیار آسون میکنه.
🔻و از type system برای توصیف داده ها استفاده میکنه.

🔸 در graphQl کلایت داده ای که نیاز داره رو درخواست میده و فقط و دقیقا همون رو دریافت میکنه.
به عنوان مثال کلایت یک graphQl query به سرور میفرسته و در query خودش در خواست نام کاربر رو میکنه ، در سمت سرور graphQl execution engine این کوئری رو دریافت میکنه و با پردازش اون یک json که فقط شامل دیتایی هست که کلاینت خواسته باز میگردونه.

🔹از مزایای دیگر graphQl، دریافت اطلاعات از چند resource فقط در یک درخواست، هست.
به عنوان مثال در یک graphQL query که کلاینت به سمت سرور فرستاده ، میتونه علاوه بر مشخصات کاربر، اطلاعات مرتبط با post ها و like های همون کاربر رو هم در همون در خواست دریافت کنه،
( به این خاطر که تمرکز graphQl بر رابطه بین آبجکت هاست).
کاری که برای انجام اون در REST API ها باید چندین درخواست به سرور میفرستادین.

🧩
تاریخچه graphQl به سال 2012 و فیسبوک برمیگرده، زمانی که فیسبوک برای Feed کردن اخبار ها در اپلیکیشن موبایلش به مشکل خورده بود.
پیاده سازی بخش News Feed در اپلیکیشن موبایل کار ساده ای نبود، اخبار ها شامل پستهایی بودند و هر پست کامنت ها و لایک هایی داشت و رابطه بینشون پیچیده ، سلسله مراتبی و به هم پیوتسه و بازگشتی بود.
و علاوه بر اینها َAPI ها طوری طراحی نشده بودند تا به توسعه دهنده ها این اجازه رو بدن تا چنین داده های بهم پیوسته رو نشون بدن و فقط داده هایی که لازم دارن را دریافت کنن.
در نتیجه این نقطه شروعی برای شکل گیری grapgQl بود.
🧩

برای استفاده از graphQl باید از لایبری های Client side و پکیج های Server Side استفاده کنین. زبانی های زیادی هستند که از GraphQl پشتیبانی میکنند لیستی از آونها رو در اینجا میتونید ببینید.

🔹در قسمت های بعدی به مقایسه graphQL و REST میپردازیم و از مزایا و معایب میگیم و اینکه کی باید از کدومشون استفاده کرد.

@FullStackDevs
#PostWoman

Postwoman
جایگزین وب برای Postman
▪️ کمک می کند تا درخواست ها را سریعتر ایجاد کنید
▫️ باعث صرفه جویی در وقت گرانبها در توسعه می شوید
▪️ پشتیبانی از زبان فارسی
▫️ درخواست های Real time
▪️ پشتیبانی از ریکوست های GraphQL

https://postwoman.io/

source on Github

@fullStackDevs
تبدیل شدن به یک برنامه نویس ارشد چیزی است که بسیاری از ما در راستای مسیر کدنویسی و ایجاد اشتغال خود برای رسیدن به آن تلاش می‌کنیم.

برنامه نویس ارشد

آنچه که فکر می‌کنیم نیست .قبل از شروع، بیایید این تفکر را از خودمان دور کنیم. این با چیزی که شما در بیش از ۹۵ درصد مشاغل آنلاین می‌بینید در تناقض است، برنامه نویس ارشد بودن تنها به سابقه‌ی موجود در رزومه‌ی شما بستگی ندارد.

درست است که بیشتر اوقات، سابقه‌ی کاری تجربه‌ی زیادی را به همراه می‌آورد و با کار کردن در بعضی از شرکت‌ها می‌توانید به آن دست یابید اما این تنها عاملی نیست که به درستی نشان دهد کسی در سطح ارشد است.

این یک مشکل رایج در دنیای نرم‌افزار مخصوصا تو ایران است و می‌تواند انتظارات زیادی را به دنبال داشته باشد.

پس چه کاری می‌توانیم انجام دهیم تا خود را برای آن نقش آماده کنیم؟

چه چیزی باعث می‌شود که برنامه نویس ارشد شویم؟

با نگاهی به حرفه خود در توسعه دهندگان تیم که بیشتر آنها تحسین شده اند، به چهار فاکتور زیر می شود پی برد:

▫️تجربه
▪️رهبری
▫️مربی‌ گری
▪️توانایی فنی

این کافی نیست که به هر یک از این موارد به عنوان تنها عملکرد افراد در یک تیم نگاه کنیم. هر برنامه‌نویسی توانایی‌های خاص خود را دارد و ممکن است در یک ویژگی خاص از دیگری قوی‌تر باشد. اما مهم این است که ببینید چگونه این خصوصیات جمع می‌شوند تا تعیین کنند چگونه کسی به رشد تیم شما کمک خواهد کرد.

تجربه
تجربه معمولا به عنوان سابقه‌ی کاری تلقی می‌شود، هرچند کاملا درست نیست ولی کل داستان را هم بیان نمی‌کند.

همانطور که هر برنامه نویس توانایی خاص خود را دارد، همین امر نشانه‌ی تجربه‌ی آنهاست. ممکن است یک برنامه نویس به مدت پنج سال در موقعیت سخت کار کند تا هر روز راه‌حل‌هایی را برای چالش‌های فنی دشوار بیابد، در حالی‌که دیگری می‌تواند روی یه اپلیکیشن که تنها وظیفه ی بروزرسانی وب سرویس های اپلیکیشن را دارد !
لزوما چیز بدی نیست! هر کدام مسیر خود را داشته‌اند و برای متناسب کردن آن باید زندگی شان را متعادل کنند . اما واقع‌‌بینانه نیست که بگوییم آن پنج سال یکسان بوده است !
پس واقعا تجربه به چه معنی است؟
شناخت مسائل در کار قبلی
هر برنامه نویسی خاطره‌ای از خطا های تصادفی را که تجربه کرده به یاد دارد. اما می‌توان با پرس و جو یا یک سرچ ساده در گوگل به آن پی برد. و سه ماه بعد وقتی روی یک پروژه دیگر کار می‌کنید و به همان خطا برخورد می‌کنید، دیگر نیاز نیست آن را در گوگل جستجو کنید یا حداقل می‌دانید که چه چیزی را سرچ کنید. چرا که از قبل می‌دانید مسئله چیست و می‌توانید سریع از آن عبور کنید.
این نوعی تجربه است که باعث ایجاد تفاوت می‌شود. توانایی تشخیص راه‌حل‌ها چیزی است که به رشد هر یک از ما کمک خواهد کرد. این ها تجربیاتی هستند که کمک می‌کنند در مواقعی که دیگر اعضا به مشکل می‌خورند، تیم عقب نیفتد و پیشرفت کند.

رهبری
از هر عضو ارشد یک تیم انتظار میرود که تمایل به رهبری داشته باشد. اگر چه این بدان معنا نیست که شما مدیر پروژه باشید و یا تصمیمات نهایی را بگیرید، این بدان معنی است که در سطحی باشید که بتوانید به پیشبرد پروژه کمک کنید.

کمک به اعضای کم تجربه‌ی تیم
معمولا برای برنامه‌نویسان پیش می‌آید که تمرکز خود را در مسائل بزرگ‌تر از دست بدهند، اما همانطور که گفتیم یک برنامه نویس ارشد باید قابلیت این را داشته باشد که در هر پروژه‌ای خلاقیت و ایده خود را به کار گیرد، اعضای تیمش را راهنمایی کند تا آنها را در مسیر درست قرار دهد.

مربی‌گری
این خیلی راحت است که به سر کار بروید و نگران این نباشید که بقیه چه کار می‌کنند، اما آیا این واقعا به نفع کسی است؟

کمک به پیشرفت اعضای تیم
در این صورت شما باید بتوانید میانگین ده برابر یک برنامه نویس معمولی که خروجی متوسطی ارائه میدهد ، خروجی داشته باشید.

به اشتراک‌گذاری دانش
این را به خودتان بسپارید که هر چه را می‌دانید با دیگران به اشتراک بگذارید. به دیگران مهلت دهید تا روی کدشان فکر کنند. اگر مشکل زیادی برای درک آن دارند، کد خودتان را با آن‌ها به اشتراک بگذارید.
این کاری است که می‌توانیم همه را به انجام آن ترغیب کنیم. شما طبیعتا با ارائه کار خود و توضیح آن به دیگران باعث می‌شوید موضوع در ذهن خودتان تثبیت شود.

توانایی فنی
به عنوان یک برنامه نویس ارشد از شما انتظار میرود که در تولید کد نسبت به برنامه‌نویسان مبتدی سریع تر عمل کنید. مثلا اگر برنامه نویس جاوااسکریپت هستید انتظار می‌رود اصول و الگوهای اصلی زبان را بهتر درک کنید.

همه‌ی ما چالش‌های منحصر به فرد خود را پیش رو داریم!
همه ی ما در کد زدن مشکلات خاص خود را داریم.


هرچه با چالش‌های بیشتر و جدی‌تری مواجه شوید، این‌را به‌خاطر داشته باشید که در حال تبدیل شدن به یک برنامه نویس ارشد هستید.
برگرفته از سایت راکت

fullStackDevs
✳️ معرفی مهمترین ویژگی های اضافه شده به Ef Core 5 Preview 7

🔹 در این پست به بررسی ویژگی های جدیدی که به این پیشنمایش افزوده شده است می پردازیم.

🔹 DbContextFactory
🔸در این پیشنمایش متد AddDbContextFactory معرفی شده که به وسیله اون میتوانید factory ای را برای ساختن اشیاء DbContext در Di Container رجیستر نمایید.

services.AddDbContextFactory<SomeDbContext>(b =>
b.UseSqlServer(ConnectionString));

🔹همچنین به کمک متد AddPooledDbContextFactory مخزنی برای نگه داری اشیاء DbContext ای که توسط DbContextFactory ساخته شده، ایجاد میکنید.و هربار که از factory شی DbContext جدیدی درخواست میکنید با بررسی مخزن در صورتی که
شی DbContext ای در دسترس باشد در اختیارتان قرار میگیرد.

🔹 نکته مهم در استفاده از DbContextFactory این است که اشیاء DbContext ساخته شده توسط Service Provider مدیریت نمیشوند و Dispose کردن آنها باید توسط اپلیکیشن (ن Container) انجام شود.
🔹Reset DbContext state

اگر طی شرایطی نیاز داشته باشید تا وضعیت شی DbContext را reset کنید استفاده از ChangeTracker.Clear() بسیار بهتر ( از نظر بهبود عملکرد) از detaching کردن همه ی Entity های track شده است.

🔹 معرفی روش جدید برای ذخیره مقادیر پیشفرض برای Column ها

🔸با استفاده از این روش میتوانید برای column های خود در Ef Core مقادیر پیشفرض تعریف کنید .همچنین Column مربوطه میتواند مقدار پیشتفرض دیتابیسی داشته باشد. در اینصورت اگر در هنگام insert در دیتابیس ، اگر مقدار column مربوطه مقدار پیشفرض Clr type آن نباشد. مقدار آن در دیتابیس Insert خواهد شد. در غیر اینصورت مقدار پیشفرض دیتابیس استفاده خواهد شد.

public class Blog
{
private bool? _isValid;

public bool IsValid
{
get => _isValid ?? false;
set => _isValid = value;
}
}
🔸 در برخی موارد استفاده از مقدار پیشفرض برخی type های Clr میتواند معانیه خاصی در اپلیکیشن داشته باشد. به عنوان مثال مقدار پیشفرض تایپ boolean مقدار false هست. گاهی اوقات مقدار false برای فیلدی در دیتابیس در اپلیکیشن معنای به خصوصی دارد در چنین شرایطی درج مقدار پیشفرض Clr ای برای این type ها دقت و حساسیت اپلیکیشن را زیر سوال میبرد.

برای حل این مشکل باید یک backing field کمک بگیریم. backing field باید نال پذیر باشد و در صورت نال بودن آن مقدار پیشفرض type را برای پراپریتی set کنیم. Ef core با watch کردن این پراپرتی متوجه میشود که مقدار ان مقدار پیشفرض clr type ان است و در نتیجه اگر برای فیلد مان مقدار پیشفرض دیتابیسی تنظیم کرده باشیم. Ef core از آن برای insert در دیتابیس استفاده میکند.

🔹ایجاد نام های مفرد هنگام reverse engineering کردن دیتابیس و Scaffold کردن DbContext

🔸تا پیش از این اگر دیتابیسی را مهندسی معکوس میکردید و زمانی که Ef Core از روی دیتابیس DbContext را scaffold میکرد برای تطابق اسامی جدول ها و Entity ها اسامی Entity ها نیز به صورت جمع تولید میشدند.
یعنی اگر در دیتابیس جدولی به نام people داشتید بعد از مهندسی معکوس کلاسی معادل با نام people تولید میشد. با افزودن این ویژگی کلاس تولید شده نامی مفرد خواهد داشت و person تولید خواهد شد.

🔹Savepoints

🔸افزودن پشتیبانی از savepoint به Ef Core با استفاده از این ویژگی، هنگامی که اجرای SaveChanges با شکست مواجع شود Ef Core ترانزکشن را به اخرین save point تعیین شده roll back خواهد کرد.
بدین صورت میتوانید یک save point ایجاد کنید.

context.Database.CreateSavepoint("MySavePoint"); 

🔸در نتیجه به جای اینکه ترانزکشن دوباره از ابتدا انجام شود. تلاش میشود که از save point تعییین شده ادامه پیدا کند. یک save point در داخل یک transaction در دیتابیس مانند یه marker عمل میکند و محلی رو تعیین میکند که اگر قستمی از transaction کنسل شده . بتوان ادامه transaction را از آنجا ادامه داد.
@fullStackDevs
#GraphQl Part2
#ApiDesign
❇️اجزای اصلی یک GaphQL کوئری
🔸Queries :
▪️یک کوئری درخواستی است که توسط کلاینت صورت میپزیرد.
🔸Resolvers :
▪️به بیان ساده یک Resolver، چگونگی fetch کردن داده ها و اینکه داده ها از از چه محلی باید آورده شوند، را انجام می دهد.در واقع resolver وظیفه آماده سازی و فراهم کردن دیتای متناظر با هر فیلد در درخواست داده شده را دارد.
🔸Schema :
▪️یک GraphQl Schema عملیاتی که کلایت بعد از متصل شدن به GraphQl میتواند انجام دهد را توصیف میکند. درون Schema مهترین ساختار type ها هستند.

🧩
توضیح کامل در مورد type های GraphQL ار در اینجا مطالعه نمایید.
🧩

🔰سوال 1 ؟ GraphQl بهتر است یا REST ؟؟

▪️سالهاست که REST به یک استاندارد برای طراحی Web Api ها تبدیل شده است.
مزایای استفاده از REST عبارتند از :
🔻Stateless servers
🔻Structured access to resources

و REST API ها در برابر تغییرات مورد نیاز کلاینت برای دسترسی به Resource ها به شدت انعطاف ناپذیر هستند.

▪️در مقابل GraphQl برای ایجاد چنین انعطاف پذیری که REST از آن برخوردار نبود توسعه داده شد و بسیاری از کم و کاستی هایی که توسعه دهندگان هنگام کار کردن با یک REST API ممکن است مواجه را برطرف میکند.


✳️معایب اصلی REST
🔸Underfetching :
▪️یکی از عمده ترین مشکلات REST میباشد هنگامی که تنها راه دریافت اطلاعات صدا زدن API میباشد و API فقط داده ای Structured و ثابت بازگشت میدهد و این امکان وجود ندارد تا بسته به نیاز کلاینت، ساختار داده بازگشتی تغیر کند.
🔸Overfetching :
▪️این مشکل به این معنی است که کلاینت در اکثر مواقع دیتایی بیشتر از آنچه که نیاز دارد، دریافت میکند.
🔸n+1 requests problem :
▪️این مشکل با نام
underfetching and the n+1-requests problem
شناخته میشود.
به طور کلی underfetching به این معنی است که یک endpoint خاص، دیتای مورد نیاز را بسته به درخواست کلاینت، نمی تواند فراهم کند و کلاینت باید برای دریافت دیتا مورد نیاز خود درخواست های متعدد ارسال کند.

🔰سوال 2 ؟ چه زمانی REST بهترین گزینه است؟
▪️در واقع یک REST API یک Concept برای اپلیکیشن های network-based میباشد و در مقابل GraphQl یک query language و مجموعه ای از ابزارهاست که برای انجام عملیات بروی یک endpoint از HTTP استفاده میکند.و علاوه بر اینها در چندین سال گذشته از REST برای ساخت API ها استفاده شده است در حالیکه GraphQL بروی بهبود عملکرد و بهینه سازی و انعطاف پذیری متمرکز است.

🔰سوال 3 ؟ بالاخره GraphQl را یاد بگیریم یا نه ؟

▪️در بین Company ها REST یک استاندارد در صنعت شناخته میشود و به عنوان یک معماری کامل پذیرفته شده است که کاربری چندین ساله دارد.
با اینکه GraphQl به اندازه REST در بین Company ها رایج نیست اما یاد گرفتن ان ارزشمند است و ارزش یادگیری آنرا دارد با automation شدن کارها زندگی آسانتر میشود در نتیجه برای ما که خالقین این automation ها هستیم سرعت و کارایی بهتر اپلیکیشن اهمیت ویژه ی دارد و تجربه کاربری بهتری را برای کاربر به ارمغان می اورد، اینجاست که بهبود عملکرد اپلیکیشن برگ برنده برنامه نویس محسوب میشود و این امر میسر نمیگردد مگر با استفاده از ابزار های مناسب خاص خود نظیر GraphQl.
@fullStackDevs
#HOC
#DesignPattern
#ReactJs

❇️ HOC (Higher Order Component) Design Pattern in React JS

🔹 این پست درباره یکی از روش های رعایت DRY با استفاده از الگوی HOC در ری اکت جی اس میباشد.

🔸 الگوی HOC تکنیکی است که از آن برای استفاده مجدد از منطق یک کامپوننت استفاده میشود.
درواقع HOC یک فانکشن است که به عنوان پارامتر یک کامپوننت دریافت میکند و خروجی آن یک کامپوننت جدید است.

🔹شرایطی را در نظر بگیرید که برای ساخت یک کامپوننت باید منطقی را پیاده سازی کنید اما قبلا یک کامپوننت دیگر با همین منطق پیاده سازی کرده اید و دو کامپوننت فقط در UI با یکدیگر متفاوت اند، در چنین شرایطی می توانید با استفاده از HOC منطق اصلی کامپوننت پیشین خود را دوباره استفاده کنید و به جای دوباره پیاده سازی کردن آن، از آن در کامپوننت جدید خود استفاده کنید. کامپوننت جدید می تواند UI ای کاملا متفاوت از کامپوننت اصلی داشته باشد، در حالی که منطق مشابهی دارد.


▫️برای دانستن اینکه HOC چیست و چگونه میتوان از آن استفاده کرد به مثال زیر توجه نمایید :
🔻در مثال زیر یک کامپوننت clickable ساده ساخته ایم که یک Button را رندر میکند و به عنوان props یک text و یک onClick ایونت دریافت میکند.
 
import React from "react";

export function Clickable(props) {
return <Button onClick={props.onClick}>
{props.text}
</Button>
}

🔻حال با استفاده از HOC می خواهیم کامپوننتی بسازیم که منطقی یکسان دارد و به آن ویژگی های جدید اضافه کنیم همچنین لازم است کامپوننت خود را Toggleable کنیم. و از این به بعد هر زمان که به HOC فانکشن خود یک Clickable کامپوننت به عنوان پارامتر دهیم یک کامپوننت جدید با عملکری Toggleable ریترن میکند.
```
import React from "react";

makeToggleable(Clickable) {

return class extends React.Component {

constructor() {
super();
this.toggle = this.toggle.bind(this);
this.state = {
show: false
};
}

toggle() {
this.setState(prevState => ({ show: !
prevState.show }));
}

render() {
return (
<div>
<Clickable {...this.props} onClick={this.toggle} />
{
this.state.show && this.props.children}
</div>
)
}
}
}
```


@fullStackDevs
#eBook

ASP.NET CORE 3 And Angular 9 👇👇

@fullStackDevs
This media is not supported in your browser
VIEW IN TELEGRAM
#css
#trick
#flex

مثال جالب برای توضیح نمایش بصورت FlexBox و Grid
@fullStackDevs
معرفی
🔻.NET 5.0 Preview 8
🔻EF Core 5.0 Preview 8
🔻ASP.NET Core (updates) in .NET 5 Preview 8

اخیرا پیش نمایش 8 از دات نت 5 معرفی شده و این نسخه از فریم وورک پیش تر از گذشته به نسخه نهایی خود نزدیک شده است همچنین پیش نمایش جدیدی از EF Core 5 و ابدیت های جدیدی برای Asp.Net Core معرفی شده است.
برای دریافت و استفاده از این ویژگی ها ویژال استادیو خود را به اخرین نسخه ابدیت کنید.

در این پست به معرفی ویژگی های مهم
EF Core 5.0 preview 8
می پردازیم.
نسخه EF Core 5.0 دات نت استاندارد 2.1 را پیاده سازی کرده است و میتوانید EF Core 5 را بروی NetCore 3.1 هم اجرا کنید و لزوما نیازی نیست تا نسخه فریم وورک حتما Net 5 باشد.

در پست های قبل گفتیم رابط خط فرمان
Ef Core 3.1 , Ef Core 3.0
به صورت پکیجی جدا نصب میشوند و دیگر به همراه خود فریم وورک عرضه نمیشوند در Ef Core 5 نیز به همین صورت میباشد و برای استفاده از رابط خط فرمان EF Core 5 باید آنرا نصب کنید.
از این رابط برای اجرای دستورات Migration و یا scaffold کردن سایر فرمان های دیگر استفاده میشود.(اصطلاحا به آن DotNet tool گفته میشود.)
یک Net tool.  ناگت پکیجی است که شامل یک پروژه کنسول اپلیکیشن میباشد و آنرا میتوانید به صورت global یا local بروی ماشین خود نصب کنید. tool هایی که به صورت global نصب میشوند از طریق هر دایرکتوری بروی ماشین قابل اجراست.

در مقابل tool هایی که به صورت لوکال نصب میشوند فقط از طریق همان دایرکتوری و ساب دایرکتوری هایش در دسترس خواهند بود.
رابط خط فرمان این پیش نمایش بدین صورت قابل نصب است :
برای نصب به صورت گلوبال :

dotnet tool install --global dotnet-ef --version 5.0.0-preview.8.20407.4

اگر قبلا نصب کرده اید فقط باید آنرا آبدیت کنید :
dotnet tool update --global dotnet-ef --version 5.0.0-preview.8.20407.4

اما
موارد جدید در EF Core 5 Preview 8

Table-per-type (TPT) mapping

در
Ef Core برای نمایش سلسله مراتب ارث بری Model ها در دیتابیس سه روش وجود دارد :

Table Per Hierarchy (TPH)
در
این روش از یک تیبل جدا برای نمایش تمام کلاس ها (مدل کلاس ها) در یک سلسله مراتب ارث بری استفاده میشود، همچنین این تیبل یک ستون به نام discriminator خواهد داشت که برای متمایز ساختن مدل ها از یک دیگر ساخته میشود .
نام تیبل ساخته شده از نام base Class گرفته میشود یا نامی که به وسیله تعریف DbSet مشخص کرده اید. توضیحات بیشتر
Table Per Type (TPT)
در این روش به ازای هر کلاس (شامل ابستراکت کلاسها ) در سلسله مراتب ارث بری یک تیبل جدا ساخته میشود و کلاس های مشتق شده به وسیله یک کلید خارجی به base class خود مرتبط میشوند. لینک مثال
Table Per Concrete Type (TPC)
در این روش به ازای هر کلاس (شامل ابستراکت کلاس ها نمیشود) و همه پراپرتی هایش(شامل پراپرتی های inherited) یک تیبل جدا ساخته میشود.
Migrations: Rebuild SQLite tables
در
مقایسه با سایر دیتابیس ها SQLite دارای محدودیت هایی در تغییرات schema دیتابیس است. برای مثال با حذف کردن یه ستون در یک تیبل که قبلا ساخته شده ، لازم است که کل تیبل حذف شود و دوباره ساخته شود. در این نسخه از EF Core 5
automatic rebuilding
اضافه شده است که تیبل مربوطه را در صورت تغییرات shema به صورت خودکار rebuild میکند.

support for mapping .NET methods to table-valued functions (TVFs)

با
استفاده از این ویژگی میتوانید با تعریفی متدی در DbContext یک TVF تعریف شده در دیتابیس رو در Linq Query خود صدا بزنین.

TVF
نوعی از فانکشن های تعریف شده توسط یوزر در sql server است که نتیجه
Select Statement
را به صورت یک تیبل برمیگرداند. مشاهده مثال


Flexible query/update mapping

نگاشت
یک Entity Type به ابجکت های متفاوت در دیتابیس، مثلا به یک فانکشن یا یک تیبل یا یک view
برای مثال Entity Type زیر هم به یک تیبل و هم به یک view نگاشت شده است.
```
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Blog>()
.ToTable("Blogs")
.ToView("BlogsView");
} ```

و به طور پیشتفرض EF Core 5 کوئری (SELECT) را از view انجام میدهد و موارد ابدیت شده رi به table میفرستد. مثال ادامه در پست بعدی ....

@fullStackDevs
ادامه پست قبلی

Context-wide split-query configuration
از
این به بعد میتوانید به صورت پیشفرض برای هر کوئری ای به وسیله DbContext اجرا میشود Split query را کانفیگ کنید.
این کانفیگوریشن فقط برای پروایدر های رابطه ای مانند sql server در دسترس است .
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseSqlServer(
Your.SqlServerConnectionString,
b => b.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery));

بدین ترتیب Ef Core به کمک ویژگی Split queries به کوئری های Linq این اجازه را میدهد تا Collection های مربوط به کوئری را که include شده اند، به چند sql query جدا شوند. این ویژگی موجب بهبود پرفورمنس شده و همچنین ممکن است موجب ناهماهنگی هایی در نتایج برگشت داده شده شود این اتفاق زمانی می افتد که داده ها در بین اجرای دو کوئری تغییر کنند.

PhysicalAddress mapping

این
ویزگی به وسیله contribute اقای رافائل آلمیدا سانتوس به Ef Core 5 اضافه شده و کلاس PhysicalAddress در دات نت استاندار به صورت خودکار در هنگام ساخت دیتابیس از روی model کلاس ها به یک ستون استرینگی مپ میشود.
@fullStackDevs