tgoop.com/dotnetcode/3074
Create:
Last Update:
Last Update:
قسمت ۱ :Extension Members
این یکی از بزرگترین تغییرات C# 14 هست! یادتونه با Extension Methods میتونستیم به کلاسهای دیگه (حتی کلاسهایی که سورسشون رو نداشتیم) رفتار (متد) اضافه کنیم؟
حالا با Extension Members میتونیم بهشون حالت (State) هم اضافه کنیم! یعنی میتونیم به کلاسی که مال ما نیست، Property، Field و حتی Event اضافه کنیم.
مثال: فرض کنید یه کلاس User از یه پکیج NuGet دارید و نمیتونید تغییرش بدید.
// این کلاس در یک لایبرری دیگه است:
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
حالا میخوایم یه Property به اسم DisplayName بهش اضافه کنیم که اسم کامل رو برگردونه:
// جادوی C# 14 با کلمه کلیدی 'extension'
public extension class UserExtension for User
{
// یه Property جدید به کلاس User اضافه کردیم!
public string DisplayName
{
// 'this' به همون نمونه 'User' اشاره داره
get => $"{this.FirstName} {this.LastName}";
}
// حتی میتونیم فیلد هم اضافه کنیم!
private bool _hasBeenWelcomed = false;
public void Welcome()
{
if (!_hasBeenWelcomed)
{
Console.WriteLine($"خوش اومدی، {this.DisplayName}!");
_hasBeenWelcomed = true;
}
}
}
نحوه استفادهاش دقیقاً مثل یه Property عادیه:
var user = new User { FirstName = "سارا", LastName = "رضائی" };
// مستقیم به Property الحاقی دسترسی داریم:
Console.WriteLine(user.DisplayName); // خروجی: سارا محمدی
user.Welcome(); // خروجی: خوش اومدی، سارا محمدی!
user.Welcome(); // (بار دوم چیزی چاپ نمیکنه)قسمت ۲ : خداحافظی با پیچیدگی LeftJoin
اگه با Entity Framework Core کار کرده باشید، میدونید که پیادهسازی یه LEFT JOIN ساده (یعنی «همه کاربرها رو بیار، و اگه کتابی داشتن، کتابهاشون رو هم بیار») چقدر میتونست پیچیده باشه. معمولاً باید از GroupJoin و SelectMany و DefaultIfEmpty استفاده میکردیم که خیلی خوانا نبود.
خبر خوب: در EF Core 10، متدهای LeftJoin و RightJoin مستقیماً اضافه شدن!
مثال: میخوایم لیست همه «نویسندهها» و «عنوان کتابهاشون» رو بگیریم، حتی اگه نویسندهای هیچ کتابی نداشته باشه.
// ----------------
// روش قدیمی در EF Core 8:
// ----------------
var oldWay = db.Authors
.GroupJoin(db.Books,
author => author.Id,
book => book.AuthorId,
(author, books) => new { Author = author, Books = books })
.SelectMany(
temp => temp.Books.DefaultIfEmpty(),
(temp, book) => new
{
AuthorName = temp.Author.Name,
BookTitle = book == null ? "(بدون کتاب)" : book.Title
});
// ----------------
// روش جدید و خوانا در EF Core 10:
// ----------------
var newWay = db.Authors
.LeftJoin(db.Books,
author => author.Id, // کلید از جدول چپ (Author)
book => book.AuthorId, // کلید از جدول راست (Book)
(author, book) => new // نتیجه نهایی
{
AuthorName = author.Name,
// اگه کتابی نباشه، 'book' و در نتیجه 'book.Title' نال میشه
BookTitle = book.Title
});
این کوئری جدید خیلی تمیزتره و دقیقاً همون چیزی رو مینویسید که تو ذهنتونه (و شبیه SQL اصلیه).
📚💻 @dotnetcode

