
آموزش Global Query Filters در EF Core
در پروژههای واقعی با Entity Framework Core، گاهی نیاز داریم فیلترهایی سراسری برای دادهها تعریف کنیم که به صورت خودکار روی همه کوئریها اعمال شوند، بدون اینکه نیاز به تکرار آنها در هر LINQ Query باشد. به این قابلیت Global Query Filters گفته میشود. در آموزش Global Query Filters در EF Core و Asp.Net Core قصد داریم به صورت کامل با این قابلیت، نحوه پیادهسازی آن، کاربردها و نکات پیشرفته آشنا شویم.
Global Query Filter چیست؟
Global Query Filter فیلترهایی هستند که در سطح مدل دیتابیس (ModelBuilder) تعریف میشوند و به صورت خودکار روی همهی کوئریهای مربوط به آن entity اعمال میشوند.
مثلاً اگر موجودیتی به نام Post داریم. و میخواهیم فقط پستهایی که IsDeleted = false هستند. در نتایج دیده شوند. میتوان این فیلتر را یک بار تعریف کرد و دیگر نیازی نیست در هر جا از LINQ از شرط where استفاده کنیم.
Global Query Filters چه کاربردهایی دارد؟
- پیادهسازی Soft Delete
- مدیریت Tenantها در سیستمهای چند مستاجری (Multi-tenancy)
- فیلتر کردن دادهها بر اساس نقش کاربر جاری
- نمایش دادههای فعال (مثل Product فعال)
Soft Delete چیست؟
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 انجام میشود، فقط پستهایی که حذف نشدهاند را نمایش میدهد.
فیلتر بر اساس ویژگیهای Context
گاهی لازم است فیلتر براساس دادهای از کانتکست مثل 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 فقط در OnModelCreating قابل تعریف هستند
- استفاده از متدهای معمول درون فیلتر مجاز نیست؛ فقط Expressionها پشتیبانی میشوند
- روی Includeها ممکن است به صورت غیرمستقیم تأثیر بگذارد
- نوشتن تست واحد برای بررسی عملکرد این فیلترها بسیار مهم است
جمعبندی
Global Query Filters ابزار بسیار قدرتمندی برای پیادهسازی سیاستهای کنترل داده هستند. و میتوانند از تکرار کدهای شرطی در کوئریها جلوگیری کنند. توصیه میشود در پروژههای واقعی حتماً از آنها استفاده شود، مخصوصاً زمانی که نیاز به امنیت بیشتر یا جداسازی داده بین کاربران وجود دارد.




























فرم افزودن دیدگاه
با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.