در پروژههای واقعی با Entity Framework Core، گاهی نیاز داریم فیلترهایی سراسری برای دادهها تعریف کنیم که به صورت خودکار روی همه کوئریها اعمال شوند، بدون اینکه نیاز به تکرار آنها در هر LINQ Query باشد. به این قابلیت Global Query Filters گفته میشود. در آموزش Global Query Filters در EF Core و Asp.Net Core قصد داریم به صورت کامل با این قابلیت، نحوه پیادهسازی آن، کاربردها و نکات پیشرفته آشنا شویم.
Global Query Filter فیلترهایی هستند که در سطح مدل دیتابیس (ModelBuilder) تعریف میشوند و به صورت خودکار روی همهی کوئریهای مربوط به آن entity اعمال میشوند.
مثلاً اگر موجودیتی به نام Post داریم. و میخواهیم فقط پستهایی که IsDeleted = false هستند. در نتایج دیده شوند. میتوان این فیلتر را یک بار تعریف کرد و دیگر نیازی نیست در هر جا از LINQ از شرط where استفاده کنیم.
Soft Delete یعنی حذف منطقی دادهها بهجای حذف فیزیکی، به این صورت که رکورد در دیتابیس باقی میماند ولی با یک فیلد مثل IsDeleted = true از نمایش در کوئریها فیلتر میشود.
فرض کنیم مدلی به نام Post داریم:
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public bool IsDeleted { get; set; }
}
و در کلاس DbContext به صورت زیر فیلتر تعریف میکنیم:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
}
اکنون تمام کوئریهایی که روی Post انجام میشود، فقط پستهایی که حذف نشدهاند را نمایش میدهد.
گاهی لازم است فیلتر براساس دادهای از کانتکست مثل TenantId یا CurrentUserId انجام شود.
public class AppDbContext : DbContext
{
public int CurrentTenantId { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().HasQueryFilter(o => o.TenantId == CurrentTenantId);
}
}
اگر در شرایطی خاص نیاز باشد. فیلتر نادیده گرفته شود. (مثلاً برای مدیر سیستم)
var allPosts = context.Posts.IgnoreQueryFilters().ToList();
Global Query Filters ابزار بسیار قدرتمندی برای پیادهسازی سیاستهای کنترل داده هستند. و میتوانند از تکرار کدهای شرطی در کوئریها جلوگیری کنند. توصیه میشود در پروژههای واقعی حتماً از آنها استفاده شود، مخصوصاً زمانی که نیاز به امنیت بیشتر یا جداسازی داده بین کاربران وجود دارد.