آموزش 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 ابزار بسیار قدرتمندی برای پیاده‌سازی سیاست‌های کنترل داده هستند. و می‌توانند از تکرار کدهای شرطی در کوئری‌ها جلوگیری کنند. توصیه می‌شود در پروژه‌های واقعی حتماً از آن‌ها استفاده شود، مخصوصاً زمانی که نیاز به امنیت بیشتر یا جداسازی داده بین کاربران وجود دارد.

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی آموزش Global Query Filters در EF Core در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه آموزش Global Query Filters در EF Core در شبکه‌های اجتماعی

نظرات شما برای ما ارزشمند است

متاسفانه تاکنون پیامی برای این مطلب ثبت نشده است. شما اولین شخصی باشید که پیام می‌گذارد.

نظرات کاربران

فرم افزودن دیدگاه

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

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.