5️⃣ قابلیت EF Core که باید بدانید 💡
بیایید صادق باشیم. همه ما میلیونها کار روی سرمان ریخته و شیرجه عمیق در هر گوشه و کنار EF Core ممکن است در بالای لیست اولویتهای شما نباشد.
اما قضیه این است: EF Core قدرتمند است و دانستن چند ویژگی کلیدی میتواند زمان و خستگی زیادی را از شما بگیرد.
بنابراین، من شما را با تک تک ویژگیهای EF Core بمباران نخواهم کرد.
در عوض، من پنج مورد ضروری را که واقعاً باید بدانید، دستچین کردهام.
ما موارد زیر را بررسی خواهیم کرد:
1️⃣ Query Splitting
- بهترین دوست جدید دیتابیس شما
2️⃣ Bulk Updates and Deletes
- کارایی به توان دو
3️⃣ Raw SQL Queries
- وقتی نیاز دارید یاغی شوید
4️⃣ Query Filters
- برای تمیز و مرتب نگه داشتن همه چیز
5️⃣ Eager Loading
- چون تنبلی همیشه هم خوب نیست
بزن بریم!
1️⃣ Query Splitting (تقسیم کوئری) ✂️
تقسیم کوئری یکی از آن ویژگیهای EF Core است که به ندرت به آن نیاز دارید. تا اینکه یک روز، به آن نیاز پیدا میکنید. Query splitting در سناریوهایی که چندین کالکشن را eager load میکنید، مفید است. این به ما کمک میکند تا از مشکل انفجار کارتزین (cartesian explosion) جلوگیری کنیم.
Department department =
context.Departments
.Include(d => d.Teams)
.Include(d => d.Employees)
.Where(d => d.Id == departmentId)
.AsSplitQuery() // جادو اینجاست
.First();
با AsSplitQuery، EF Core برای هر navigation کالکشن، یک کوئری SQL اضافی اجرا خواهد کرد. با این حال، مراقب باشید که بیش از حد از آن استفاده نکنید.
2️⃣ Bulk Updates and Deletes (آپدیتها و حذفهای دستهای) ⚡️
EF Core 7
دو API جدید برای انجام آپدیتها و حذفهای دستهای اضافه کرد، ExecuteUpdate و ExecuteDelete. آنها به شما اجازه میدهند تعداد زیادی از ردیفها را در یک رفت و برگشت به دیتابیس به طور موثر آپدیت کنید.
// افزایش ۵٪ حقوق تمام کارمندان فروش در یک کوئری
context.Employees
.Where(e => e.Department == "Sales")
.ExecuteUpdate(s => s.SetProperty(e => e.Salary, e => e.Salary * 1.05m));
// حذف تمام سبدهای خرید قدیمیتر از یک سال در یک کوئری
context.Carts
.Where(o => o.CreatedOn < DateTime.Now.AddYears(-1))
.ExecuteDelete();
این کار بدون بارگذاری انتیتیها در حافظه، مستقیماً دستور UPDATE یا DELETE را در دیتابیس اجرا میکند.
3️⃣ Raw SQL Queries (کوئریهای SQL خام) 👨💻
EF Core 8
یک ویژگی جدید اضافه کرد که به ما اجازه میدهد انواع داده مپنشده را با SQL خام کوئری بزنیم.
public class ProductSummary
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public decimal TotalSales { get; set; }
}
var productSummaries = await context.Database
.SqlQuery<ProductSummary>(
$"""
SELECT p.ProductId, p.ProductName, SUM(oi.Quantity * oi.UnitPrice) AS TotalSales
FROM Products p ...
""")
.ToListAsync();
متد SqlQuery یک IQueryable برمیگرداند، که به شما اجازه میدهد کوئریهای SQL خام را با LINQ ترکیب کنید.
4️⃣ Query Filters (فیلترهای کوئری) 🔍
فیلترهای کوئری مانند دستورات WHERE قابل استفاده مجدد هستند که میتوانید به انتیتیهای خود اعمال کنید. این فیلترها به طور خودکار به کوئریهای LINQ هر زمان که انتیتیهای نوع مربوطه را بازیابی میکنید، اضافه میشوند.
کاربردهای رایج:
• حذف منطقی (Soft Deletes)
• چند-مستأجری (Multi-tenancy)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// _currentTenantId بر اساس درخواست/زمینه فعلی تنظیم میشود
modelBuilder.Entity<Product>().HasQueryFilter(p => p.TenantId == _currentTenantId);
}
// حالا، کوئریها به طور خودکار بر اساس مستأجر فیلتر میشوند
var productsForCurrentTenant = context.Products.ToList();