آموزش Global Query Filters در EF Core

تهران آی تی / برنامــه نویــسـی / آموزش Global Query Filters در EF Core

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

جستجو کنید
دسترسی سریع
دسته ها

طراحی و پیاده سازی پروژه های طراحی سایت دانشجویی

انجام، اجرا و طراحی پروژه های طراحی سایت برای دانشجویان با HTML CSS PHP ASP.NET JAVA و ... با کمترین هزینه. برای مشاهده نمونه کارها و یا دریافت مشاوره رایگان از تیم طراحی سایت تهران آی تی با ما در تماس باشید. ما بهترین پروژه های طراحی سایت را با حداقل هزینه برای شما طراحی میکنیم - مشاوره رایگان 09121486770

مــشاوره و مشاهده نمونه کارها

مطالب مرتبط

لطفا از مطالب مرتبط با این پست دیدن فرمایید

جــذاب های هفته

از پربازدیدترین مطالب تهران آی تی در هفته ای که گذشت دیدن فرمایید

باورکردنی نیست فقط با 300 هزار تومان

طراحی سایت شما + طراحی اپلیکیشن هدیه و رایگان
این یک حراج است در مدت زمان محدود - شرکت های زیادی سایت های ارزان طراحی میکنند اما آیا کیفیت لازم را دارا هستند؟ طراحی سایت ارزان به همراه اپلیکیشن رایگان هدیه برای اولین بار توسط تهران آی تی مخصوص سازمان ها و کسب و کار های کوچک و بزرگ و حتی جدید تیم طراحی سایت تهران آی تی در کنار شماست تا شناخته شوید - مشاوره رایگان 09121486770

مــشاوره و مشاهده نمونه کارها

پشتیبانی 24 ساعته

تیم تهران آی تی در هفت روز هفته و 24 ساعت روز آماده پاسخ گویی به سوالات کاربران و ارائه مشاره رایگان میباشد